我正在尝试解析一个巨大的tab限制文件(tsv文件)并将其转换为逗号分隔值文件。 我遇到的问题是并非所有tsv文件中的条目都是完整的,其中一些条目不完整,并且条目之间有多个制表符间距。现在,当我将其转换为csv文件时,我希望它们之间有“n.a”表示记录的该字段中没有任何条目。
例如,考虑学生记录样本(1个标签= 4个空格,承认我的格式不佳)
Name Age Department GPA
Kevin 21 Computer Science 3.4
Tom 20 3.8
Kelsey 22 Psychology (2 tab spaces here)
在上面的例子中,第一条记录表示字段标题,每一行都是一条记录。 我们可以观察到汤姆缺少“部门”字段条目,而Kelsey缺少“GPA”字段条目。 我的输出应该是这样的:
"Name","Age","Department","GPA"
"Kevin","21","Computer Science","3.4"
"Tom","20","n.a","3.8"
"Kelsey","22","Psychology","n.a"
我的问题:
1)我该如何解决这个问题? Python,java,bash,awk任何脚本都可以
2)观察“计算机”和“计算机”之间的空格。 “部门”字段下第2行中的“科学”被忽略并保留。因此生成的脚本不应该计算空格。
完美地完成这一点非常重要,因为我将为搜索索引提供数据。提前谢谢。
答案 0 :(得分:4)
这可以在python中完成,非常简单:
import sys
[infile, outfile] = sys.argv[1:]
with open(infile) as inf:
with open(outfile) as outf:
for l in inf:
outf.write(','.join(l.split('\t')).replace(',,',',n.a.,'))
该脚本将像
一样使用python convert_csv.py infile outfile
答案 1 :(得分:1)
使用awk
的一种方式:
awk '
## Split line with tabs, join them in output with commas.
BEGIN {
FS = "\t";
OFS = ",";
}
## For each line, check if any field is blank, and substitute with
## "n.a". Add double quotes, recompute line and print.
{
for ( i = 1; i <= NF; i++ ) {
if ( $i == "" ) {
$i = "n.a";
}
$i = "\"" $i "\"";
}
$1 = $1;
print $0;
}
' infile
使用以下输出运行它:
"Name","Age","Department","GPA"
"Kevin","21","Computer Science","3.4"
"Tom","20","n.a","3.8"
"Kelsey","22","Psychology","n.a"
答案 2 :(得分:0)
在每一行上使用split('\ t')...
>>> x="a\t\tb"
>>> x
'a\t\tb'
>>> print x
a b
>>> x.split("\t")
['a', '', 'b']
>>>
答案 3 :(得分:0)
在python中,
inputFile = open.("yourFile.tsv", "r")
outputFile = open.("output.csv", "w")
for line in inputFile:
entry = line.split("\t")
for i in range(len(entry)):
if entry[i] == '':
entry[i] = "n.a"
outputFile.write(",".join(entry))
inputFile.close()
outputFile.close()
应该有效,虽然它不是特别Pythonic。