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

and*_*ewj 48 linux csv

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

只是为了澄清,此文件中没有嵌入的选项卡.

Ign*_*ams 75

如果您担心嵌入式逗号,那么您需要使用稍微更智能的方法.这是一个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)
Run Code Online (Sandbox Code Playgroud)

从shell运行它,如下所示:

python script.py < input.tsv > output.csv
Run Code Online (Sandbox Code Playgroud)

  • 它可能不是"最快的",但它确实为我处理嵌入的选项卡和逗号. (2认同)

Mar*_*off 51

如果您只需要将所有制表符转换为逗号字符,那么tr可能就是这样.

这里的空白是一个文字标签:

$ echo "hello   world" | tr "\\t" ","
hello,world
Run Code Online (Sandbox Code Playgroud)

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

  • 更常见的是源中的嵌入式逗号,然后需要用引号括起来.如果有嵌入式引号,这很麻烦...... (16认同)
  • 这是一个不完整的答案; ````必须转换为````for CSV,如果字段包含引号或逗号或换行符,则必须用```引号括起来(尽管在作为TSV表示的数据中不存在换行符). (2认同)

小智 20

perl -lpe 's/"/""/g; s/^|$/"/g; s/\t/","/g' < input.tab > output.csv
Run Code Online (Sandbox Code Playgroud)

Perl在这种情况下通常比sed,awk和Python更快.

  • 对我来说最好的答案,只有一点变化,scape双引号:perl -lpe's /"/ \\"/ g; s/^ | $ /"/ g; s /\t /","/ g'<... (3认同)

小智 9


Wil*_*ung 6

sed -e 's/"/\\"/g' -e 's/<tab>/","/g' -e 's/^/"/' -e 's/$/"/' infile > outfile
Run Code Online (Sandbox Code Playgroud)

该死的评论家,引用一切,CSV并不关心.

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


jtl*_*lai 6

@ 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)
Run Code Online (Sandbox Code Playgroud)