CSV-файл - удалить перевод строки в середине строки - PullRequest
3 голосов
/ 12 февраля 2020

У меня есть CSV-файл, как показано ниже. Иногда в средней колонке есть перевод строки. есть ли способ заменить перевод строки в unix пробелом, используя sed, awk или что-то еще? -

COLA,COLB,COLC,COLD
test,test2,"test3",test4
test5,"test6
test666
test67","test7",test8
test9,test10,test11,test12

в приведенных выше данных вторая запись фактически является одной записью -

test5,"test6
test666
test67","test7",test8

Ответы [ 4 ]

2 голосов
/ 12 февраля 2020

Используя Миллера (https://github.com/johnkerl/miller) и запустив

mlr --csv put '
  for (k in $*) {
    $[k] = gsub($[k], "\n", " ");
  }
' input.csv >output.csv

, вы получите

COLA,COLB,COLC,COLD
test,test2,test3,test4
test5,test6 test666 test67,test7,test8
test9,test10,test11,test12
2 голосов
/ 12 февраля 2020

Perl на помощь!

perl -MText::CSV_XS=csv -we 'csv( in    => "file.csv",
                                  on_in => sub { $_[1][1] =~ s/\n/ /g } )'

on_in указывает обратный вызов для обработки ввода; $_[1] содержит текущую строку, поэтому $_[1][1] соответствует столбцу 1 (на основе 0, т.е. 2-й столбец).

См. Text :: CSV_XS .

0 голосов
/ 12 февраля 2020

Это может работать для вас (GNU sed):

sed -E ':a;/^(([^",]*,)*("[^"]*",)*)*"[^"]*$/{N;s/\n/,/;ta}' file

Если строка содержит несопоставленный ", добавьте следующую строку, замените новую строку на , и повторите.

0 голосов
/ 12 февраля 2020

Стандартные инструменты командной строки, даже awk, не до конца понимают CSV. Вы можете создать что-то, что работает должным образом с более продвинутым языком, таким как python / perl / ruby ​​/ GO / et c.

Если все, что вы хотите сделать, это свернуть разделенные линии, следующий хак может do:

awk -F, 'NF==4{print;next} NF<4{x=(x~/./?x" ":"") $0; if(split(x,a,FS)>=4){print x;x=""}}' input.csv

Или для более простого чтения:

BEGIN {
 FS=OFS=","
}

NF==4 {
  print
  next
}

NF<4 {
  x=(x ~ /./ ? x" " : "") $0
  if (split(x,a,FS)>=4) {
    print x
    x=""
  }
}

Это будет печататься и двигаться, если в строке 4 поля. Для любого меньшего числа полей он начнет объединять строки, пока не увидит как минимум 4 поля, а затем напечатает то, что собрал. Обратите внимание, что возвращаемое значение функции split() должно быть числом элементов массива, созданного разделением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...