Как преобразовать разделенный табуляцией файл в разделенный запятыми файл - PullRequest
30 голосов
/ 18 августа 2010

Я хочу преобразовать файл с разделителями табуляции в CSV-файл

Может ли кто-нибудь мне помочь

Ответы [ 8 ]

35 голосов
/ 13 мая 2015

Ответ для OSX другой.

MacOS не понимает \t в выражении sed.

Вы должны вставить литерал табуляции в шаблон поиска sed, используя ctrl + v затем tab (см. Как вставить символ табуляции с помощью sed в OS X? )

sed 's/ /,/g' input_file > output_file
32 голосов
/ 18 августа 2010

Вы можете использовать sed как:

sed 's/\t/,/g' input_file > output_file

Это сохранит входной файл без изменений и создаст новый файл output_file с изменениями.

Если вы хотите изменить сам входной файл без создания нового файла, вы можете использовать опцию -i для выполнения изменений на месте:

sed -i 's/\t/,/g' input_file 
5 голосов
/ 30 сентября 2016

Имейте в виду, что существует много разновидностей файла значений, разделенных запятыми. Поскольку вы не указали его, я предполагаю, что формат RFC-4180 в кодировке UTF-8 и TSV будут одинаковыми, но с использованием табуляции вместо запятых.

Наивным подходом было бы просто заменить каждую вкладку запятой:

tr '\t' ,

Это значение уменьшается, если какое-либо из значений уже содержит запятую или если любое из них содержит вкладку в кавычках. Вам нужно будет минимально разобрать файл, чтобы сохранить цитирование. Вместо ручного запуска такого парсера, проще, понятнее и гибче использовать уже написанный, такой как Text::CSV для Perl:

#!/usr/bin/perl -w

use Text::CSV;

my $tsv = Text::CSV->new({ sep_char => "\t", auto_diag => 2 });
my $csv = Text::CSV->new();

while (my $row = $tsv->getline(*ARGV)) {
    $csv->print(STDOUT, $row) or die $csv->error_diag();
    print $/;
}
$csv->error_diag() unless $tsv->eof;
2 голосов
/ 03 октября 2014

Этого также можно достичь с помощью Perl:

Чтобы передать результаты в новый выходной файл, вы можете использовать следующее:
perl -wnlp -e 's/\t/,/g;' input_file.txt > output_file.csv

Если вы хотитеЕсли вы хотите отредактировать файл на месте, вы можете вызвать опцию -i:
perl -wnlpi -e 's/\t/,/g;' input_file.txt

Если по какой-то случайности вы обнаружите, что на самом деле вы имеете дело не с вкладками, а с несколькими пробелами,Вы можете использовать следующее для замены каждого вхождения двух или более пробелов запятой:
perl -wnlpi -e 's/\s+/,/g;' input_file

Имейте в виду, что \s представляет любой символ пробела, включая пробелы, символы табуляции или символы новой строки, и не можетиспользоваться в строке замены.

0 голосов
/ 22 декабря 2016

sed -e 's / TAB_CHAR /, / g' data.tsv> data.csv

Самое сложное - как ввести символ TAB в командной строке, чтобы сделать это: Просто история "CTRL + V", затем TAB

Я часто использую это с запросами mysql с параметром -e, как описано в этом посте http://blog.modsaid.com/2013/12/exporting-data-from-remote-mysql.html

0 голосов
/ 18 августа 2010

Является ли это обычным делом для всех простых вопросов? Хорошо, вот мое решение на Haskell:

main = interact (unlines . replTab . lines) where
  replTab l = l       >>= (\line ->
    "\"" ++ line "\"" >>= \char ->
    case char of
      '\t' -> "\",\""
      '"'  -> "\"\""
      _    -> [char]
    )

не проверено, но должно работать.

PS: все другие решения не знают о возможности избежать запятых.

0 голосов
/ 18 августа 2010

В Unix:

sed -i -e 's/\t/,/g' filename
0 голосов
/ 18 августа 2010

Попробуйте заменить все вкладки запятыми.

Возможно с регулярным выражением типа s/\t/,/g, если у вас нет полей в кавычках.

Или, знаете, Excel мог бы сделать это для тебя. Или R. Или все, что может взять в файле TSV.

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