2010-08-23 5 views
2

У меня есть относительно большой файл данных csv/text (33mb), который мне нужен, чтобы выполнить глобальный поиск и заменить символ разметки. (Причина в том, что, похоже, не существует способа заставить SQLServer избегать/обрабатывать двойные кавычки в данных во время экспорта таблицы, но это еще одна история ...)Как эффективно искать/заменять большой файл txt?

Я успешно выполнил поиск по Textmate и замените его на меньший файл, но он задыхается от этого более крупного файла.

Похоже командной строки Grep может быть ответом, но я не могу вполне понять синтаксис, ала:

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

Так что в моем случае я ищу для «^» (каре) характер и замена с «"»(двойные кавычки).

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

это не работает, и я предполагаю, что он должен делать с побега из двойных кавычек или что-то, но я довольно потерял. Помогите кому-нибудь?

(я полагаю, что если кто-нибудь знает, как получить SQLServer2005 обрабатывать двойные кавычки в текстовом столбце при экспорте в CSV, который бы действительно решить основную проблему.)

ответ

3

Ваша замена Perl кажется неправильным. Попробуйте:

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

Объяснение:

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

Это работало и помогло объяснить это ясно. Большое спасибо! –

+0

О, ладно, мне не хватало «очков», чтобы сделать это раньше. Благодарю. –

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

Update: вы также можете использовать Perl, как узда предложил

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

Но на больших файлах, СЭД может работать немного быстрее чем Perl, так как мой результат показывает на файле в 6 миллионов строк

$ 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

Спасибо за помощь. Я никогда не пользовался sed, но если это так лаконично, стоит посмотреть. :) –

+1

perl -i.bak -pe '/ \ ^/"/ g' mylargefile.csv не так уж и дольше ... – reinierpost

Смежные вопросы