Я хочу преобразовать выделенный раздел в файл csv
может кто-нибудь мне помочь
Я хочу преобразовать выделенный раздел в файл csv
может кто-нибудь мне помочь
Ответ для OSX отличается.
MacOS не понимает \t
в выражении sed
.
Вы должны вставить литерал табуляции в шаблон поиска sed с помощью ctrl + v, затем tab (см. Как вставить символ табуляции с sed на OS X?)
sed 's/ /,/g' input_file > output_file
Вы можете использовать sed как:
sed 's/\t/,/g' input_file > output_file
Это сохранит входной файл без изменений и создаст новый файл output_file
с изменениями.
Если вы хотите изменить входной файл самостоятельно, не создавая новый файл, вы можете использовать опцию -i
для sed, чтобы делать изменения на месте:
sed -i 's/\t/,/g' input_file
Имейте в виду, что существует много разновидностей файла с разделителями-запятыми. Поскольку вы не указали один, я предполагаю 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;
Это также может быть достигнуто с помощью 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
представляет любой символ пробела, включая пробелы, вкладки или символы новой строки и не может использоваться в заменяющей строке.
Попробуйте заменить все вкладки запятыми.
Возможно, с регулярным выражением, например s/\t/,/g
, если у вас нет кавычек.
Или, знаете, Excel может сделать это для вас. Или R. Или все, что может принять файл TSV.
Это обычная вещь для простых вопросов? Хорошо, вот мое решение haskell:
main = interact (unlines . replTab . lines) where
replTab l = l >>= (\line ->
"\"" ++ line "\"" >>= \char ->
case char of
'\t' -> "\",\""
'"' -> "\"\""
_ -> [char]
)
не проверен, но должен работать.
PS: Все другие решения не знают об эвакуационных запятых.
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
В unix:
sed -i -e 's/\t/,/g' filename