我有一个制表符分隔的文件,有超过2亿行。 linux中将此转换为csv文件的最快方法是什么?这个文件确实有多行标题信息,我需要在路上删除,但标题的行数是已知的。我看过sed
和gawk
的建议,但我想知道是否有“首选”选择。
只是澄清一下,此文件中没有嵌入的标签。
答案 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中分隔的选项卡