我想将制表符分隔文件转换为csv文件
任何人都可以帮助我
答案 0 :(得分:34)
OSX的答案不同。
MacOS无法理解\t
表达式中的sed
。
您必须使用 ctrl + v 然后 tab 将标签文字插入sed搜索模式(请参阅How can I insert a tab character with sed on OS X? )
sed 's/ /,/g' input_file > output_file
答案 1 :(得分:31)
您可以将sed用作:
sed 's/\t/,/g' input_file > output_file
这将保持输入文件不变,并将创建带有更改的新文件output_file
。
如果您想在不创建新文件的情况下更改输入文件本身,可以使用-i
选项进行内部更改:
sed -i 's/\t/,/g' input_file
答案 2 :(得分:5)
请记住,有许多口味的逗号分隔值文件。由于您没有指定一个,我将假设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;
答案 3 :(得分:2)
这也可以通过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
表示任何空白字符,包括空格,制表符或换行符,不能在替换字符串中使用。
答案 4 :(得分:0)
这是通常易于提问的全语言吗?好的,这是我的haskell解决方案:
main = interact (unlines . replTab . lines) where
replTab l = l >>= (\line ->
"\"" ++ line "\"" >>= \char ->
case char of
'\t' -> "\",\""
'"' -> "\"\""
_ -> [char]
)
未经测试,但应该有效。
PS:所有其他解决方案都不知道转义为逗号。
答案 5 :(得分:0)
在MacOS中进行测试后,这可以将csv文件转换为tsv文件(假设列值中不存在任何制表符或逗号):
cat file_input.tsv | tr '\t' ',' > file_output.csv
我尝试过:
sed 's/ /,/g' input_file > output_file
和
sed 's/\t/,/g' input_file > output_file
但是,它们都不起作用。
答案 6 :(得分:-1)
sed -e' s / TAB_CHAR /,/ g' data.tsv> data.csv
棘手的部分是如何在命令行中输入TAB字符,为此: 只需按下" CTRL + V"然后选择TAB
我经常使用带有-e参数的mysql查询,如本博文http://blog.modsaid.com/2013/12/exporting-data-from-remote-mysql.html中所述
答案 7 :(得分:-2)
尝试用逗号替换所有标签。
如果您没有任何引用字段,可能使用s/\t/,/g
这样的正则表达式。
或者,你知道,Excel可以为你做那件事。或R.或任何可以接收TSV文件的内容。
答案 8 :(得分:-2)
在unix中:
sed -i -e 's/\t/,/g' filename