Necesita encontrar y reemplazar usando expresiones regulares en TextWrangler - GREP, para un archivo CSV
-
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
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.