2010-02-11 3 views
0

J'ai une liste comme ceci:Comment convertir une liste csv (horizontale) de la paire de valeurs de nom placé verticalement

GTPYANJ   695848 
GTPYANJ   27811 
FPORTAL3  432532 

Je veux en faire cela en utilisant des expressions régulières:

GTPYANJ,695848,27811 
FPORTAL3,432532 

Suggestions?

+1

Cela me semble que cela serait beaucoup plus facile si je n'utilisais pas d'expressions régulières. –

+2

Ma suggestion: n'utilisez pas d'expressions régulières. –

+0

Ceci est pour un rapport ponctuel où l'écriture de code serait trop lourde. Sinon, il serait simple de le lire et de remplir une hashtable et de l'utiliser. – Maladon

Répondre

0

charge dans jEdit (ou Notepad ++, ou un autre éditeur qui peut rechercher/remplacer par regex.

Étape 1 est de faire Assurez-vous que le délimiteur est un onglet

Ensuite, recherchez

^(.*)\t(.*)\n\1 

et le remplacer par

$1\t$2, 

Répétez la recherche/remplacer tous les jusqu'à ce qu'il n'y plus de matches se trouvent.

+1

Ceci bien sûr ne fonctionne que pour votre fichier très particulier. Si vous lancez un espace blanc supplémentaire, ou si votre liste n'est pas triée, cela se terminera misérablement. Sans oublier que si vous avez des milliers, voire des centaines d'entrées, vous êtes obligé de répéter la recherche/le remplacement manuellement, car je ne connais aucun remplacement de recherche qui recommence indéfiniment au début jusqu'à ce qu'il ne reste plus de correspondance. –

+0

Bon point. Pour ma tâche de manipulation de données ponctuelle, cela a très bien fonctionné. En tant que solution programmatique, il faudrait une approche différente. – Maladon

0

Perl one-liner:

perl -e 'while(<>) { chomp; ($tag, $num) = split /\s+/; $tmp{$tag} .= ",$num"; } foreach $t (sort keys %tmp) { print $t.$tmp{$t}."\n" } ' myfile.txt 

beaucoup plus facile que d'essayer d'entraver ensemble une expression régulière à plusieurs passes qui plus casser probablement deux ou trois fois avant de faire les choses, et qui dépend des données étant triés, et qui pourrait nécessiter une deuxième regex reformater tout à la fin ...

Questions connexes