如何将制表符分隔文件转换为逗号分隔文件

时间:2010-08-18 05:57:02

标签: unix

我想将制表符分隔文件转换为csv文件

任何人都可以帮助我

9 个答案:

答案 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