2016-02-12 4 views
0

У меня есть очень большие .csv-файлы, содержащие необработанные данные. Многие поля имеют передние и конечные пробелы, и многие значения полей многословного слова, которые должны иметь только одно пространство между символьными группами/словами, имеют дополнительные пробелы, например.Обрезать файл csv с помощью командной строки

'12 Anywhere Street' 

, который должен быть:

'12 Anywhere Street' 

Ведущий, задней и лишние пробелы изменяются от одного дополнительного пространства до шести дополнительных пространств. Я могу загрузить файлы в свою БД и запустить скрипты, чтобы обрезать их. Ведущие и завершающие скрипты отделки отлично работают и выполняются быстро; тем не менее, скрипты для удаления лишних пробелов между словами намного дольше и требуют много времени. Было бы лучше удалить лишние пробелы между словами в необработанном CSV-файле, используя командную строку, прежде чем загружать ее в мою БД.

Мне нужно запустить функцию замены, которая заменяет любой экземпляр «» на «», «», «», ... до шести пробелов или около того. Я был бы очень признателен за помощь в этом.

+0

Какая ОС вы используете? Linux? Пожалуйста, укажите это в своем вопросе. Также вы можете привести пример нескольких строк вашего файла данных? – Wossname

+0

Использование окон, но может легко создать экземпляр Linux для этого. Столбцы с дополнительными пробелами между словами содержат (цитируется по полю) «имя и фамилия», «уличный адрес», «город», строка текста в формат предложения ". Некоторые таблицы/.csv-файлы имеют гораздо больше лишних пробелов, чем другие. Надеюсь, это поможет. – pbnyc

+0

Окно сообщения автоматически удаляет пробелы. – pbnyc

ответ

0

В первой части этого ответа я сначала предполагаю, что в вашем CSV-файле есть разделитель полей (например, «,»), который НЕ происходит в любом поле. Во второй части я рассмотрю более общий случай.

Часть 1.

awk -F, ' 
    function trim(s) { 
    sub(/^ */,"",s); sub(/ *$/,"",s); gsub(/ */," ",s); return s; 
    } 
    BEGIN {OFS=FS} 
    {for (i=1;i<=NF;i++) { $i=trim($i) }; print }' 

Часть 2.

Для обработки в общем случае, это лучше всего использовать CSV-осведомленный инструмент (например, Excel или один из команды csv2tsv -line) для преобразования CSV в простой формат, в котором разделитель значений буквально не встречается внутри значений. Формат TSV (с разделительными знаками) является особенно подходящим, поскольку он позволяет отображать вкладки в поля.

Затем выполните вышеуказанную команду awk, используя awk -F"\t" вместо awk -F,.

Чтобы восстановить исходный формат, используйте такой инструмент, как Excel, tsv2csv или jq. Вот JQ колдовство если вы хотите «стандартный» CSV файл:

jq -Rr 'split("\t") | @csv' 

В крайнем случае, на следующий, вероятно, будет достаточно:

awk -F"\t" ' 
BEGIN{OFS=","; QQ="\"";} 
    function q(s) { if (index(s,OFS)) { return QQ s QQ }; return s} 
    function qq(s) { gsub(QQ, QQ QQ, s); return QQ s QQ } 
    function wrap(s) { if (index(s,QQ)) { return qq(s) } return q(s)} 
    { s=wrap($1); for (i=2;i<=NF;i++) {s=s OFS wrap($i)}; print s}' 
+0

Редактирование файлов в excel не является вариантом. Если бы это было так, то обрезка была бы простой. – pbnyc

0

В MacOS или Linux вы можете сделать:

cat data.csv | tr -s [:space:] > formatted.csv 

Это не будет обрезать каждое значение, но удалит все повторяющиеся пробелы. Может быть, вам это поможет.

+0

Это позволит удалить лишние пробелы, но не будет обрезать каждое значение. – peak

+0

Вы правы. Я уточнил. –