besoin de trouver et remplacer l'utilisation d'expressions régulières dans textwrangler - grep, pour un fichier csv
-
14-10-2019 - |
Question
J'ai ce fichier csv, le texte brut ici: http://pastie.org/1425970
Qu'est-ce qu'il ressemble à Excel: http://cl.ly/3qXk
Un exemple de ce que je voudrais qu'il ressemble à (juste en utilisant la première ligne comme exemple): http: // cl .ly / 3qYT
Texte brut de première ligne: http://pastie.org/1425979
Je dois créer un fichier csv, d'importer toutes les informations dans une table de base de données.
Je pourrais créer manuellement le csv, mais je voulais voir s'il était possible d'y arriver en utilisant des expressions régulières dans textwrangler (grep) rechercher et remplacer
La solution
Les expressions régulières ne sont pas vraiment la meilleure façon d'y arriver. Comme d'autres l'ont noté, vous êtes mieux écrire du code pour analyser le fichier dans le format souhaité.
Cela dit, ce regex laid devrait vous aider à mi-chemin:
Trouver:
(\d+),"?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?"?
Remplacer:
\1,\2\r\1,\3\r\1,\4\r\1,\5\r\1,\6\r\1,\7\r\1,\8
Ce qui vous laissera quelques lignes supplémentaires, comme ci-dessous:
1,1
1,8
1,11
1,13
1,
1,
1,
2,10
2,11
2,12
2,
2,
...
Vous pouvez nettoyer les lignes supplémentaires à la main, ou avec l'expression rationnelle suivante:
Trouver:
\d+,\r
Remplacer:
(empty string)
Autres conseils
L'utilisation de Perl, vous pouvez faire quelque chose comme ceci:
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);
Je ne sais pas TextMate. Mais en général, je peux décrire ce qu'il faut pour le faire en pseudo-code.
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, quelque chose comme ça ..
while ($line = <DATA> ) {
chomp $line;
@data_array = split /[, "]+/, $line;
for $otherfield ( @data_array[ 1 .. $#data_array ]) {
print "$data_array[0], $otherfield\n";
}
}
Il devrait être facile si vous avez une capacité partagée.