besoin de trouver et remplacer l'utilisation d'expressions régulières dans textwrangler - grep, pour un fichier csv

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

  •  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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top