2017-02-05 6 views
0

У меня есть файл CSV, который выглядит следующим образом:Добавление нового столбца в CSV файл

"12345","TestTest","1.2","TestTest 
" 

Я хочу добавить дату, такие как YYYY-MM-DD HH: MM: SS или к началу или конец файла CSV. Как видно из приведенного выше примера, двойная кавычка («) заключает в себя значения в столбцах, а запятая (,) определяет каждый столбец. Проблема заключается в том, что двойная кавычка в конце строки всегда находится на новой строке. Это означает, что когда я пытался использовать sed для поиска/замены на основе одной двойной кавычки, моя замена заканчивается не только в начале строки, но и в конце строки.

My next теория заключается в том, что можно использовать некоторый инструмент (sed, awk, whatever) для добавления в дату только тогда, когда начало строки CSV - это двойная кавычка и число, то есть: «12345», поэтому новая строка выглядит так:

"YYYY-MM-DD HH:MM:SS","12345","TestTest","1.2","TestTest 
" 

ПРИМЕЧАНИЕ. Эта команда, которую вы предлагаете, должна применять это изменение к e очень строка в CSV-файле. Это также необходимо запустить с помощью командной строки linux.

Спасибо,

ответ

1

С СЕПГ:

sed 'N;s/^/"YYYY-MM-DD HH:MM:SS",/' file 

Если вы хотите, чтобы убедиться, что есть один " на следующей строке:

sed 'N;/\n"$/s/^/"YYYY-MM-DD HH:MM:SS",/' file 

Edit:

Вставить строку после 5-го Поле:

sed 'N;s/","/","YYYY-MM-DD HH:MM:SS","/5' file 
+0

Можно ли выбрать одно из полей столбца? В моем CSV есть 13 полей. Можете ли вы заставить sed подсчитать количество (,) разделителя и вставить его в 5-й столбец против начала или конца? – Alby

+0

Я отредактировал свой ответ, но вы должны использовать 'awk' для работы с csv-файлами. – SLePort

+0

Спасибо. Использование sed для вставки моих данных в несколько колонок - это волшебство, в котором я нуждался. – Alby

2

awk на помощь!

$ awk -F, 'NF>1{$0 = "\"YYYY-MM-DD\"" FS $0}1' file 

NF>1 тест проверяет, есть ли более одного поля на линии, если так предварять его с новым полем, 1 в конце представляет собой сокращенную {print}.

+0

Можно ли выбрать одно из полей столбца? В моем CSV есть 13 полей. Можете ли вы сделать awk подсчитать количество (,) разделителя и вставить его в 5-й столбец против начала или конца? – Alby

+0

Используйте $ 5 вместо $ 0 в инструкции. – karakfa

+0

Вам необходимо также установить OFS, если вы измените поле. –

1

Я предлагаю использовать парсер csv, чтобы избежать проблем с полями, которые могут содержать разделитель или новые строки. Вы можете использовать модуль Text::CSV в командной строке perl. Пример вставки строки в 4-й столбец:

perl -MText::CSV -E'$csv = Text::CSV->new({binary=>1}); 
while ($row = $csv->getline(STDIN)){ 
    splice @$row, 3, 0, "YYYY-MM-DD"; 
    say "\"", join("\",\"",@$row), "\"" 
}' file.csv 
Смежные вопросы