Подтвердить что ты не робот

Как преобразовать файл с разделяемой вкладкой в ​​файл, разделенный запятыми

Я хочу преобразовать выделенный раздел в файл csv

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

4b9b3361

Ответ 1

Ответ для OSX отличается.

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

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

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

Ответ 2

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

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

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

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

sed -i 's/\t/,/g' input_file 

Ответ 3

Имейте в виду, что существует много разновидностей файла с разделителями-запятыми. Поскольку вы не указали один, я предполагаю 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;

Ответ 4

Это также может быть достигнуто с помощью 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 представляет любой символ пробела, включая пробелы, вкладки или символы новой строки и не может использоваться в заменяющей строке.

Ответ 5

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

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

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

Ответ 6

Это обычная вещь для простых вопросов? Хорошо, вот мое решение haskell:

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

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

PS: Все другие решения не знают об эвакуационных запятых.

Ответ 7

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

Ответ 8

В unix:

sed -i -e 's/\t/,/g' filename