Конвертировать CSV в TSV - PullRequest
       1

Конвертировать CSV в TSV

0 голосов
/ 19 сентября 2019

Как преобразовать этот CSV-файл в файл с разделителями табуляции?

"Country","Percent","Percent of patients","home health","home health agency","friends and family","Surveys","Response"
"Nation","88","85","83","84","78",,

Обратите внимание, что столбцы Surverys и Response являются пустыми строками.

Я использую этот код для преобразования его вфайл вкладки -

sed 's/\"\,\"/\"\t\"/g'
sed 's/\,\,/\t""\t/g'

Хотя последний столбец не преобразуется.Это вывод, который я получаю (обратите внимание, что последний столбец опущен) -

"Country"   "Percent"   "Percent of patients"   "home health"   "home health agency"    "friends and family"    "Surveys"   "Response"
"Nation"        "88"    "85"    "83"    "84"    "78"    ""

В заголовке 8 столбцов и только 7 столбцов в данных, разделенных табуляцией, поэтому последний столбец пропущен.

ОБНОВЛЕНИЕ

В именах моих столбцов есть запятые.

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

На самом деле, ваш последний столбец вообще не пропущен.Вы просто не видите это, потому что это вкладка.Вы можете проверить это с помощью xxd.

Кроме того, вам не нужно экранировать запятые и двойные кавычки в sed, поскольку все внутри одинарных кавычек.

sed 's/","/"\t"/g; s/,,/\t""\t/g;' $YOUR_CSV | xxd | tail -1.

Это показывает, что последняя строка заканчивается табуляцией (x09) после последней кавычки и перед завершающим символом новой строки:

00000090: 3834 2209 2237 3822 0922 2209 0a         84"."78".""..

Что пропущено, так это двойные кавычки вокруг этого последнего пустого значения.Но они вам не нужны.Если вы действительно хотите эти двойные кавычки, вы можете добавить это к вашей команде sed:

s/\t$/\t""/

Она заменит вкладку в конце строки на вкладку, за которой следуют 2 двойные кавычки.

Однако эта простая подстановка sed может, конечно, легко потерпеть неудачу в зависимости от ваших данных.

Например (при использовании - вместо \t для видимости), если у вас есть пустые столбцы, которыене в конце:

echo '"Nation","88",,,"84","78",,' | sed 's/","/"-"/g; s/,,/-""-/g;'

Будет выводить

"Nation"-"88"-""-,"84"-"78"-""-

(обратите внимание на запятую перед "84")

Поэтому я бы предложил использовать специальный инструмент, а нечем быстрая линия сед.Например, csvtool доступно в большинстве дистрибутивов (sudo apt install csvtool для Debian).

csvtool -t COMMA -u TAB cat $YOUR_CSV
0 голосов
/ 19 сентября 2019

с GNU awk.

awk 'BEGIN{FS="\",\""; OFS="\t"} {FS=","; for(i=1; i<=NF; i++) {gsub(/"/,"",$i); $i="\"" $i "\""} print}' file

Выход:

"Country"      "Percent"       "Percent of patients"   "home health"   "home health agency"    "friends and family"       "Surveys"       "Response"
"Nation"        "88"    "85"    "83"    "84"    "78"    ""      ""
0 голосов
/ 19 сентября 2019

Я использую FPAT с gnu awk для обработки файлов CSV

awk -v FPAT='([^,]+)|("[^"]+")' -v OFS='\t' '{$1=$1}1' file
"Country"       "Percent"       "Percent of patients"   "home health"   "home health agency"    "friends and family"    "Surveys"       "Response"
"Nation"        "88"    "85"    "83"    "84"    "78"

Не уверен, что вы подразумеваете под последним столбцом, отсутствует.Если он пуст ,,, вы его не увидите.

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