Necesita encontrar y reemplazar usando expresiones regulares en TextWrangler - GREP, para un archivo CSV

StackOverflow https://stackoverflow.com/questions/4586414

  •  14-10-2019
  •  | 
  •  

Pregunta

Tengo este archivo CSV, texto sin formato aquí: http://pastie.org/1425970

Cómo se ve en Excel: http://cl.ly/3qxk

Un ejemplo de cómo me gustaría que se viera (solo usando la primera fila como ejemplo): http://cl.ly/3qyt

Texto sin formato de la primera fila: http://pastie.org/1425979

Necesito crear un archivo CSV, para importar toda la información en una tabla de base de datos.

Podría crear manualmente el CSV, pero quería ver si era posible lograr esto usando expresiones regulares en TextWrangler (GREP) Buscar y reemplazar

¿Fue útil?

Solución

Las expresiones regulares no son realmente la mejor manera de lograr esto. Como otros han señalado, es mejor escribir algún código para analizar el archivo en el formato que desea.

Dicho esto, esta fea regex debería llevarte a la mitad:

Encontrar:

(\d+),"?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?"?

Reemplazar:

\1,\2\r\1,\3\r\1,\4\r\1,\5\r\1,\6\r\1,\7\r\1,\8

Que te dejará con algunas filas adicionales, como a continuación:

1,1
1,8
1,11
1,13
1,
1,
1,
2,10
2,11
2,12
2,
2,
...

Puede limpiar las filas adicionales a mano, o con la siguiente regex:

Encontrar:

\d+,\r

Reemplazar:

(empty string)

Otros consejos

Usando Perl, podrías hacer algo como esto:

open(my $read,"<","input.csv") or die ("Gah, couldn't read input.csv!\n"); open(my $write,">","output.csv") or die ("WHAAAARGARBL!\n"); while(<$read>) { chomp; if(/(\d+),"(.*)"/) { my @arr=split(/,/,$2); foreach(@arr) { print $write $1.",".$2."\n"; } } } close($read); close($write);

No conozco compañero de texto. Pero en general, puedo describir lo que se necesita para hacer esto en el pseudocódigo.

loop, read each line  
   strip off the newline
   split into an array using /[, "]+/ as delimeter regex
   loop using result. an array slice from element 1 to the last element
       print element 0, comma, then itterator value
   end loop
end loop

En Perl, algo como esto ...

while ($line = <DATA> ) {
    chomp $line;
    @data_array = split /[, "]+/, $line;
    for $otherfield ( @data_array[ 1 .. $#data_array ]) {
        print "$data_array[0], $otherfield\n";
    }
}

Debería ser fácil si tiene una capacidad dividida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top