Замените запятую с вертикальной панелью |, за исключением случаев внутри двойных кавычек и удалить двойные кавычки

Это проблема с часовым поясом, поэтому мои сертификаты не могут подтвердить проход.

Решение: сервер и клиент используют некоторый часовой пояс.

7
25.07.2018, 14:23
7 ответов

По крайней мере, в системах на основе Debian -вы должны иметь возможность установить OCaml -на основеcsvtool

$ csvtool -u '|' cat file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

Вы также можете использовать модуль Perl Text::CSV:

$ perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new()} 
  print join "|", $p->fields() if $p->parse($_)
' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
8
27.01.2020, 20:13

Использованиеcsvkit:

$ csvformat -D '|' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

csvkitпредставляет собой набор инструментов для манипулирования/запроса CSV, написанных на Python. Они правильно анализируют CSV, а csvformatможно использовать для замены разделителя-запятой по умолчанию любым другим символом. Утилита позаботится о правильности цитирования результата в соответствии с правилами CSV.

22
27.01.2020, 20:13

Чтобы решить вашу проблему:

awk 'BEGIN{FS=",";OFS="|";} {print $1,$2","$3,$4,$5,$6,$7}' Test | tr -d \"

для таких обобщенных задач, как эта, GNU awkимеет FPAT специальную переменную для описания полей:

awk -vFPAT='[^,]*|("[^"]*")' -vOFS='|' '{$1=$1;print}' Test | tr -d \"
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc

с инструментами awkи sed, вам не нужен дополнительный пакет. РЕДАКТИРОВАТЬ как упоминал Исак , я обновляю свой ответ:

awk -vFPAT='[^,]*|(["].*["])' -vOFS='|' '{print $1,$2,$3,$4,$5,$6}' Test | sed 's/\"//g'
2
27.01.2020, 20:13

Использование SED:

Вариант 1:

sed -e 's#,\([^ ]\)#|\1#g;s#"##g;s#|,#||#g' file

12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
  • \([^ ]\)заменить все запятые, за которыми не следует пробел.
  • Затем удалите "и замените запятую перед префиксом |.

обычно в контексте запятая ставится с пробелом. Если не в вашем случае, попробуйте приведенный ниже код.

Вариант 2:

sed -e  's#^#\n#;:a;s#\n\([^,"]\|"[^"]*"\)#\1\n#;ta;s#\n,#|\n#;ta;s#\n##;s#"##g' file

12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
2
27.01.2020, 20:13

С очень коротким скриптом Python, использующим модуль csv:

import csv,sys

with open(sys.argv[1]) as csvfile:
    csvr = csv.reader(csvfile)
    for line in csvr:
        print('|'.join(line))

Это работает следующим образом:

$ python3 csvfile.py input.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
0
27.01.2020, 20:13

С автономнымperl:

perl -pe 's{"(.*?)"|,}{$1 // "|"}ge' < "$File" > "$Output"

(предполагается, что значения не содержат |, "или символов новой строки ).

2
27.01.2020, 20:13

Вы также можете сделать это, используя python pandas ниже:

import pandas as pd
df1=pd.read_csv('input.csv',quotechar = '"',skipinitialspace=True)
df1.to_csv('output.csv', sep='|', index=False)
0
17.05.2021, 19:07

Теги

Похожие вопросы