2010-08-23 10 views
2

Je dispose d'un fichier de données CSV/texte relativement volumineux (33 Mo) dont j'ai besoin pour effectuer une recherche globale et remplacer le caractère de délimitation. (La raison en est qu'il ne semble pas y avoir un moyen d'obtenir SQLServer pour échapper/gérer des guillemets dans les données lors d'une exportation de table, mais c'est une autre histoire ...)Comment chercher/remplacer efficacement sur un grand fichier txt?

J'ai réussi une recherche Textmate et remplacer sur un fichier plus petit, mais il s'étouffe sur ce fichier plus volumineux.

Il semble que la ligne de commande grep peut être la réponse, mais je ne peux pas tout à fait saisir la syntaxe, ala:

grep -rl OLDSTRING . | xargs perl -pi~ -e ‘s/OLDSTRING/NEWSTRING/’ 

Donc, dans mon cas, je suis à la recherche de la «^» (caret) le caractère et les remplacer par « " »(guillemet).

grep -rl " grep_test.txt | xargs perl -pi~ -e 's/"/^' 

qui ne fonctionne pas et je suppose qu'il doit faire avec l'échappement du guillemet ou quelque chose, mais je suis assez perdu. Aider quelqu'un?

(je suppose que si quelqu'un sait comment obtenir SQLServer2005 gérer des guillemets doubles dans une colonne de texte lors de l'exportation au format CSV, ce serait vraiment résoudre la question de base.)

Répondre

3

Votre substitution perl semble erroné. Essayez:

grep -rl \" . | xargs perl -pi~ -e 's/\^/"/g' 

Explication:

grep : command to find matches 
-r : to recursively search 
-l : to print only the file names where match is found 
\" : we need to escape " as its a shell meta char 
. : do the search in current working dir 
perl : used here to do the inplace replacement 
-i~ : to do the replacement inplace and create a backup file with extension ~ 
-p : to print each line after replacement 
-e : one line program 
\^ : we need to escape caret as its a regex meta char to mean start anchor 
+0

Cela a fonctionné et aidé à l'expliquer clairement. Merci beaucoup! –

+0

Oh, d'accord, je n'avais pas assez de "points" pour le faire avant. Merci. –

2
sed -i.bak 's/\^/"/g' mylargefile.csv 

Mise à jour: vous pouvez également utiliser Perl comme carte blanche a suggéré

perl -i.bak -pe 's/\^/"/g' mylargefile.csv 

Mais sur de gros fichiers, sed peut courir un peu plus vite que Perl, comme mon résultat montre sur un fichier de ligne de 6 millions

$ tail -4 file 
this is a line with^
this is a line with^
this is a line with^

$ wc -l<file 
6136650 

$ time sed 's/\^/"/g' file >/dev/null 

real 0m14.210s 
user 0m12.986s 
sys  0m0.323s 
$ time perl -pe 's/\^/"/g' file >/dev/null 

real 0m23.993s 
user 0m22.608s 
sys  0m0.630s 
$ time sed 's/\^/"/g' file >/dev/null 

real 0m13.598s 
user 0m12.680s 
sys  0m0.362s 

$ time perl -pe 's/\^/"/g' file >/dev/null 

real 0m23.690s 
user 0m22.502s 
sys  0m0.393s 
+0

Merci pour l'aide. Je n'ai jamais utilisé Sed, mais si c'est concis, ça doit valoir la peine d'être vu. :) –

+1

perl -i.bak -pe 's/\ ^/"/ g' mylargefile.csv n'est pas plus long ... – reinierpost

Questions connexes