我有一个制表符分隔的文件,有超过2亿行.linux中将此转换为csv文件的最快方法是什么?这个文件确实有多行标题信息,我需要在路上删除,但标题的行数是已知的.我已经看到了建议sed和gawk,但我不知道是否有一个"优先"选择.
只是为了澄清,此文件中没有嵌入的选项卡.
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)
Mar*_*off 51
如果您只需要将所有制表符转换为逗号字符,那么tr可能就是这样.
这里的空白是一个文字标签:
$ echo "hello world" | tr "\\t" ","
hello,world
Run Code Online (Sandbox Code Playgroud)
当然,如果你在文件中的字符串文字中嵌入了标签,那么这也会错误地翻译它们; 但是嵌入的文字标签很不常见.
小智 20
perl -lpe 's/"/""/g; s/^|$/"/g; s/\t/","/g' < input.tab > output.csv
Run Code Online (Sandbox Code Playgroud)
Perl在这种情况下通常比sed,awk和Python更快.
小智 9
如果要将整个tsv文件转换为csv文件:
$ cat data.tsv | tr "\\t" "," > data.csv
Run Code Online (Sandbox Code Playgroud)
如果要省略某些字段:
$ cat data.tsv | cut -f1,2,3 | tr "\\t" "," > data.csv
Run Code Online (Sandbox Code Playgroud)
上面的命令会将data.tsv文件转换为仅包含前三个字段的data.csv文件.
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输入它.
@ 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)
| 归档时间: |
|
| 查看次数: |
77725 次 |
| 最近记录: |