最快的方法是将制表符分隔的文件转换为linux中的csv

时间:2010-03-29 00:55:25

标签: linux csv

我有一个制表符分隔的文件,有超过2亿行。 linux中将此转换为csv文件的最快方法是什么?这个文件确实有多行标题信息,我需要在路上删除,但标题的行数是已知的。我看过sedgawk的建议,但我想知道是否有“首选”选择。

只是澄清一下,此文件中没有嵌入的标签。

11 个答案:

答案 0 :(得分:73)

如果您担心嵌入式逗号,那么您需要使用稍微更智能的方法。这是一个Python脚本,它从stdin获取TSV行并将CSV行写入stdout:

import sys
import csv

tabin = csv.reader(sys.stdin, dialect=csv.excel_tab)
commaout = csv.writer(sys.stdout, dialect=csv.excel)
for row in tabin:
  commaout.writerow(row)

从shell运行它,如下所示:

python script.py < input.tsv > output.csv

答案 1 :(得分:46)

如果您需要做的只是翻译所有标签字符到逗号字符,tr可能就是这样。

此处的空格是文字标签:

$ echo "hello   world" | tr "\\t" ","
hello,world

当然,如果你在文件中的字符串文字中嵌入了标签,那么这也会错误地翻译它们;但是嵌入的文字标签很不常见。

答案 2 :(得分:19)

perl -lpe 's/"/""/g; s/^|$/"/g; s/\t/","/g' < input.tab > output.csv

Perl在这方面通常比sed,awk和Python更快。

答案 3 :(得分:7)

  • 如果要将整个tsv文件转换为csv文件:

    $ cat data.tsv | tr "\\t" "," > data.csv
    
  • 如果您想省略某些字段:

    $ cat data.tsv | cut -f1,2,3 | tr "\\t" "," > data.csv
    

    上述命令会将data.tsv文件转换为仅包含前三个 字段的data.csv文件

答案 4 :(得分:6)

sed -e 's/"/\\"/g' -e 's/<tab>/","/g' -e 's/^/"/' -e 's/$/"/' infile > outfile
该死的评论家,引用一切,CSV并不关心。

<tab>是实际的制表符。 \ t对我不起作用。在bash中,使用^ V输入它。

答案 5 :(得分:5)

@ ignacio-vazquez-abrams的python解决方案很棒!对于想要解析分隔符其他选项卡的人来说,库实际上允许您设置任意分隔符。这是我修改后的版本来处理管道分隔文件:

import sys
import csv

pipein = csv.reader(sys.stdin, delimiter='|')
commaout = csv.writer(sys.stdout, dialect=csv.excel)
for row in pipein:
  commaout.writerow(row)

答案 6 :(得分:3)

假设您不想更改标题并假设您没有嵌入标签

# cat file
header  header  header
one     two     three

$ awk 'NR>1{$1=$1}1' OFS="," file
header  header  header
one,two,three

NR&gt; 1跳过第一个标题。你提到你知道有多少行标题,所以请为你自己的情况使用正确的数字。有了这个,你也不需要调用任何其他外部命令。只有一个awk命令完成这项工作。

另一种方法,如果你有空白列并且你关心它。

awk 'NR>1{gsub("\t",",")}1' file

使用sed

sed '2,$y/\t/,/' file #skip 1 line header and translate (same as tr)

答案 7 :(得分:0)

以下awk oneliner支持引用+ quote-escaping

printf "flop\tflap\"" | awk -F '\t' '{ gsub(/"/,"\"\"\"",$i); for(i = 1; i <= NF; i++) { printf "\"%s\"",$i; if( i < NF ) printf "," }; printf "\n" }'

给出

"flop","flap""""

答案 8 :(得分:0)

您也可以为此使用xsv

xsv input -d '\t' input.tsv > output.csv

在对300MB tsv文件的测试中,它的速度大约比python解决方案快5倍(2.5s对14s)。

答案 9 :(得分:0)

右键单击文件,单击重命名,删除't'并放入'c'。我实际上不是在开玩笑,大多数csv解析器都可以处理制表符分隔符。我现在遇到了这个问题,出于我的目的,重命名效果很好。

答案 10 :(得分:-1)

我认为最好不要捕获文件,因为它可能会在大文件的情况下产生问题。更好的方法可能是

$ tr ',' '\t' < csvfile.csv > tabdelimitedFile.txt

该命令将从csvfile.csv获取输入并将结果存储为tabdelimitedFile.txt中分隔的选项卡