Это проблема с часовым поясом, поэтому мои сертификаты не могут подтвердить проход.
Решение: сервер и клиент используют некоторый часовой пояс.
По крайней мере, в системах на основе 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
Использование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.
Чтобы решить вашу проблему:
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'
Использование 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
С очень коротким скриптом 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
С автономнымperl
:
perl -pe 's{"(.*?)"|,}{$1 // "|"}ge' < "$File" > "$Output"
(предполагается, что значения не содержат |
, "
или символов новой строки ).
Вы также можете сделать это, используя python pandas ниже:
import pandas as pd
df1=pd.read_csv('input.csv',quotechar = '"',skipinitialspace=True)
df1.to_csv('output.csv', sep='|', index=False)