关于unix:如何将制表符分隔文件转换为逗号分隔文件

How to convert a tab separated file into comma separated file

我想将一个以制表符分隔的文件转换为csv文件

有人能帮我吗


OSX的答案是不同的。

macos不理解sed表达式中的\t

您必须使用ctrl+v,然后使用t,将标签文字插入到SED搜索模式中(请参阅如何在OS X上插入带有SED的标签字符?)

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


您可以使用sed作为:

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

这将保持输入文件不变,并将创建一个新文件output_file,其中包含更改。

如果要在不创建新文件的情况下更改输入文件本身,可以使用-i选项对sed执行就地更改:

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


请记住,逗号分隔值文件有很多种味道。由于您没有指定一个,所以我假设RFC-4180格式,采用UTF-8编码,TSV是相同的,但使用制表符而不是逗号。

简单的方法是用逗号替换每个标签:

1
tr '\t' ,

如果任何值已经包含逗号,或者如果任何值包含带引号的制表符,则此值将下降。您需要最少地解析文件,以保持引用。与手动滚动这样的解析器不同,使用已经编写的解析器(如Text::CSVfor perl:

1
2
3
4
5
6
7
8
9
10
11
12
#!/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实现:

要将结果通过管道传输到新的输出文件,可以使用以下内容:埃多克斯1〔3〕

如果要就地编辑文件,可以调用-i选项:江户十一〔四〕号

如果您偶然发现所处理的不是真正的制表符,而是多个空格,则可以使用以下命令将两个或多个空格的每次出现替换为逗号:埃多克斯1〔5〕

请记住,\s表示任何空格字符,包括空格、制表符或换行符,不能在替换字符串中使用。


这是所有语言的常见问题吗?好的,这是我的haskell解决方案:

1
2
3
4
5
6
7
8
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

最棘手的部分是如何在命令行中输入制表符,这样做:只需按"ctrl+v",然后按tab键

我经常在mysql查询中使用-e参数,如本文http://blog.modsay.com/2013/12/exporting-data-from-remote-mysql.html所述。


在Unix中:

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

尝试用逗号替换所有标签。

如果没有任何带引号的字段,可以使用类似于s/\t/,/g的regex。

或者,你知道,Excel可以帮你做到这一点。或者R.或者任何可以接收TSV文件的东西。