es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usando SSIS o T-SQL, divida una columna de valores separados por comas, ya sean entrecomillados o sin entrecomillar, en varias columnas.

Tengo datos separados por comas en una columna llamada C0. Los datos en C0 se ven así:

C0
“Pacey LLC.”,213830ZZ,11/1/2017,11/1/2017,”297,311.74″,”2,371.40″,0.00,”1,325.18″,0.00,42.22,”123,986.56″
Mike The Miker,9814140VCD,12/1/2018,12/1/2018,”3,917,751.99″,”419,743.54″,”36,642.66″,”344,090.43″,0.00,10.00,”2,434,671.06″

Y quiero que termine así:

F1 F1 F3 F4 F5 F6 F7 F8 F9 F10 F11
“Pacey LLC.” 213830ZZ 11/1/2017 11/1/2017 297,311.74 2,371.40 0.00 1,325.18 0.00 42.22 123,986.56
Mike The Miker 9814140VCD 12/1/2018 12/1/2018 3,917,751.99 419,743.54 36,642.66 344,090.43 0.00 10.00 2,434,671.06

He intentado reemplazos anidados, pero no pude encontrar un patrón para buscar de manera confiable sin regex, que es T/SQL. También intenté un enfoque TOKEN en SSIS por este caballero, pero tampoco fue fructífero. Los enfoques de reemplazo anidado se atascaron en los campos de dinero que están por debajo de 1,000 (como 0.00) y el enfoque TOKEN SSIS presume que todos los campos están delimitados por comillas, lo cual no es cierto en mi ejemplo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de abordar este problema es utilizando la función PARSENAME en T-SQL. La función PARSENAME se utiliza típicamente para extraer partes de un nombre de objeto de base de datos de cuatro partes (por ejemplo, esquema.tabla.columna), pero también se puede utilizar para extraer valores de una cadena delimitada.

    Primero, podemos utilizar la función REPLACE para reemplazar todas las instancias de ” con un espacio en blanco para eliminar las comillas. Luego, podemos utilizar la función PARSENAME para extraer cada campo de la cadena separada por comas.

    Aquí hay una consulta de ejemplo:

    SELECT 
        PARSENAME(REPLACE(C0, '"', ''), 10) AS F1,
        PARSENAME(REPLACE(C0, '"', ''), 9) AS F2,
        PARSENAME(REPLACE(C0, '"', ''), 8) AS F3,
        PARSENAME(REPLACE(C0, '"', ''), 7) AS F4,
        PARSENAME(REPLACE(C0, '"', ''), 6) AS F5,
        PARSENAME(REPLACE(C0, '"', ''), 5) AS F6,
        PARSENAME(REPLACE(C0, '"', ''), 4) AS F7,
        PARSENAME(REPLACE(C0, '"', ''), 3) AS F8,
        PARSENAME(REPLACE(C0, '"', ''), 2) AS F9,
        PARSENAME(REPLACE(C0, '"', ''), 1) AS F10,
        PARSENAME(REPLACE(C0, '"', ''), 0) AS F11
    FROM myTable
    

    Este código utiliza la función REPLACE para eliminar todas las instancias de ” de la columna C0. Luego, utiliza la función PARSENAME para extraer cada campo de la cadena separada por comas, comenzando desde el campo más a la derecha (denotado por 0) y avanzando hacia la izquierda. Cada campo recibe un alias separado (por ejemplo, F1, F2, etc.) para una mayor legibilidad.

    Tenga en cuenta que este enfoque asume que el número de campos en cada cadena separada por comas es fijo, y que no hay comas adicionales en ninguno de los valores de campo. Si estas suposiciones no se cumplen, entonces puede ser necesario un preprocesamiento adicional antes de utilizar PARSENAME.

Comments are closed.