DAX: ¿Cómo dividir (izquierda) una columna de texto en Carácter (espacio)?

Un usuario Pregunto ✅

Hola, estoy tratando de dividir «Nombre» en «Nombre» y «Apellido». ¿Cómo hago esto?

Encontré la función DAX «izquierda», pero debe proporcionar un recuento de caracteres para dividir, en lugar de un carácter para dividir, también conocido como espacio en este caso. También probé:

First Name = 
LEFT( 'Table1'[Name], 
     SEARCH(" ", 'Table1'[Name], 0, 
         LEN('Table1'[Name])
     )
)

¡Gracias de antemano por su ayuda!

Hola @SarWal,

En su escenario, como desea dividir una columna en función del espacio en lugar de un carácter, debe reemplazar el espacio con una función SUSTITUIR () de uso de carácter, luego dividir el valor usar la función Buscar (). Consulte las capturas de pantalla a continuación:

Nombre = IZQUIERDA(SUSTITUIR(Tabla1[Name],» «,»-«),BUSCAR(«-«,SUSTITUIR(Tabla1[Name],» «,»-«))-1)

Apellido = DERECHO(SUSTITUTO(Tabla1[Name],» «,»-«),LARGO(SUSTITUIR(Tabla1[Name],» «,»-«))-BUSCAR(«-«,SUSTITUIR(Tabla1[Name],» «,»-«)))

q1.PNG

Si tiene alguna pregunta, no dude en preguntar.

Atentamente,
qiuyun yu

TimMarsh

Soy un principiante de DAX, por lo que esta es probablemente una forma ineficiente de hacer esto.

Método suponiendo que tiene un delimitador como ,. Suponga que el esquema es LNAME, FNAME (cambie los nombres de las columnas a continuación para que se adapten)

1. Encuentra la posición de la coma, luego resta uno. Esa es la longitud de LNAME.

2. Recorte desde la posición inicial izquierda 1 el número anterior.

=TRIM(
//trim from left, the number of chars in FIND
LEFT(Table,
//this find finds the comma position from the start char on left, then subtracts one for last name length
FIND(",",Table[NameCol],1)-1))

3. Encuentra Len de nombre completo (por ejemplo, LNAME, FNAME), resta 1 para la coma (aprendí que los espacios no se cuentan al hacer este ejercicio).

4. Resta el nombre completo de Len-1 del apellido de Len para obtener FNAME Len

5. Recorte a la derecha en esa lente

=TRIM(
//trim from right the name col,
RIGHT(Table[NameCol], 
//the  length of whole name
LEN(Table[NameCol])
//minus the length of the last name
-(FIND(",",Table[NameCol],1))-1)
//to get the first name
)

Construí esta lógica en unas pocas columnas para determinar la longitud de las cadenas, la posición de la coma, etc.

fsfmendonca

Nombre = PATHITEM(SUSTITUTO(‘fTable'[FullName];» «;»|»);1)

Apellido = PATHITEMREVERSE(SUSTITUTO(‘fMesa‘[FullName];» «;»|»);1)

geddadac

En respuesta a fsfmendonca

=PATHITEMREVERSE(SUSTITUTO(Rendimiento[Performance Review Rating],»-«,»|»),1)

muchas gracias gurú

Hola @SarWal,

En su escenario, como desea dividir una columna en función del espacio en lugar de un carácter, debe reemplazar el espacio con una función SUSTITUIR () de uso de carácter, luego dividir el valor usar la función Buscar (). Consulte las capturas de pantalla a continuación:

Nombre = IZQUIERDA(SUSTITUIR(Tabla1[Name],» «,»-«),BUSCAR(«-«,SUSTITUIR(Tabla1[Name],» «,»-«))-1)

Apellido = DERECHO(SUSTITUTO(Tabla1[Name],» «,»-«),LARGO(SUSTITUIR(Tabla1[Name],» «,»-«))-BUSCAR(«-«,SUSTITUIR(Tabla1[Name],» «,»-«)))

q1.PNG

Si tiene alguna pregunta, no dude en preguntar.

Atentamente,
qiuyun yu

chang

En respuesta a v-qiuyu-msft

Hola,

Tu solución es excelente y útil para mí. ¿Tiene alguna idea si hay un primer y segundo apellido de alguien y solo desea obtener el apellido?

Por ejemplo, si hay un texto llamado «John George Washington Bosh Wang» y solo quieres sacar el Wang, ¿tienes alguna idea?

Anónimo

En respuesta a chang

Una solución elegante para navegar por los delimitadores en Vertipaq es aprovechar las funciones PATHITEM() y PATHLENGTH() mediante SUBSTITUTE().

Por ejemplo, si su delimitador fuera «.» y quería devolver «Simon» (el sexto elemento) de «Hello.Friend.My.Name.Is.Simon.Nuss»:

PATHITEM( SUBSTITUTE( [Column1], ".", "|" ), 6 )

Si desea devolver la última aparición, es decir, «Nuss», puede realizar:

Result = 
    VAR Nodes = SUBSTITUTE( [Column1], ".", "|" )
RETURN
    PATHITEM( Nodes, PATHLENGTH( Nodes ) )

Si desea devolver la tercera última ocurrencia, es decir, «Es», puede realizar:

Result = 
    VAR Nodes = SUBSTITUTE( [Column1], ".", "|" )
RETURN
    PATHITEM( Nodes, PATHLENGTH( Nodes ) - 3 )

¡Buena suerte!

Simón

amtanner

En respuesta a v-qiuyu-msft

Hola @v-qiuyu-msft,

Estoy tratando de lograr lo mismo que se menciona en la publicación inicial; sin embargo, tengo problemas con la fórmula que proporcionó en torno a la función de BÚSQUEDA. Aparece un mensaje de error que dice: «El texto de búsqueda proporcionado para la función ‘BUSCAR’ no se pudo encontrar en el texto dado». Aquí hay un ejemplo:

La descripción del artículo es «NOMBRE DEL PRODUCTO DE LA EMPRESA» y necesito dividirlo en dos columnas separadas que lean la columna n.º 1 «EMPRESA» y la columna n.º 2 «NOMBRE DEL PRODUCTO». La fórmula que estoy usando es:

Tipo de módulo = DERECHO (SUSTITUTO (WFR_New_Module_View[Item Description],»»,»-«),LEN(SUSTITUIR(WFR_New_Module_View[Item Description],»»,»-«))-BUSCAR(«-«,SUSTITUIR(WFR_New_Module_View[Item Description]»,»-«)))

¿Alguna idea de por qué esto no funciona?

Vvelarde

En respuesta a amtanner

@amtanner

El La columna NOMBRE DEL PRODUCTO DE LA EMPRESA tiene un «-» ?. El error que indica es que no puedo encontrar esto – en su columna

mateoc15

En respuesta a Vvelarde

Tuve que hacer un if/else por alguna razón.

SI(el valor contiene «:», mid(el valor, «:»), «»)

De lo contrario, vomitó como lo describiste.

amtanner

En respuesta a Vvelarde

@Vvelarde Lo tengo, eso tiene sentido. Entonces digamos que, usando el mismo ejemplo, tLa descripción del artículo es «NOMBRE DE LA COMPAÑÍA NOMBRE DEL PRODUCTO» y necesito dividirlo en dos columnas separadas que lean la columna n.º 1 «NOMBRE DE LA COMPAÑÍA» y la columna n.º 2 «NOMBRE DEL PRODUCTO». En este momento, la fórmula funciona con la solución que sugirió, pero la está dividiendo para que la columna n. ° 1 lea «COMPAÑÍA» y la columna n. ° 2 lea «NOMBRE NOMBRE DEL PRODUCTO». Esperemos que eso tenga sentido.

Vvelarde

En respuesta a amtanner

@amtanner

Debe comenzar a buscar después de encontrar el primer espacio:

BUSCAR(» «,columna,BUSCAR(» «;columna)+1)

amtanner

En respuesta a Vvelarde

@Vvelarde

Aquí está la cadena actual que estoy usando:

Tipo de módulo = DERECHO (SUSTITUTO (WFR_New_Module_View[Item Description],»»,» «),LEN(SUSTITUIR(WFR_New_Module_View[Item Description],»»,» «)) – BUSCAR(» «,SUSTITUIR(WFR_New_Module_View[Item Description],»»,» «)))

Con esta cadena, tomará el texto «FUERZA DE TRABAJO HORARIO LISTO» y lo transformará en la columna n.º 1 «FUERZA DE TRABAJO» y la columna n.º 2 «HORARIO DE LISTA».

Dada su sugerencia, ¿dónde estaría la cadena revisada? BUSCAR(» «,columna,BUSCAR(» «;columna)+1) cabe en la cadena anterior?

Lo he intentado: Tipo de módulo = DERECHO (SUSTITUTO (WFR_New_Module_View[Item Description],»»,» «),LEN(SUSTITUIR(WFR_New_Module_View[Item Description],»»,» «)) – BUSCAR(» «,columna,BUSCAR(» «;columna)+1)))

… pero recibo un mensaje de error. ¿Pensamientos?

Vvelarde

En respuesta a amtanner

hola @amtanner

Reemplazar

BUSCAR(» «,columna,BUSCAR(» «;columna)+1

a

BUSCAR(» «,WFR_New_Module_View[Item Description],BUSCAR(» «;WFR_New_Module_View[Item Description])+1

amtanner

En respuesta a Vvelarde

@Vvelarde ¡Gracias!

cantor

¿Ha considerado hacer esto en el Editor de consultas? Puede simplemente seleccionar la columna, seleccionar la columna dividida de la cinta y elegir dividir por delimitador. Luego seleccione el espacio.

Creará dos nuevas columnas.

Captura2.JPG

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *