Python 统计tsv文件中的多个选项卡
我试图解析一个巨大的tab受限文件(tsv文件),并将其转换为逗号分隔的值文件。 我遇到的问题是,tsv文件中并非所有条目都是完整的,其中一些条目是不完整的,并且由条目之间的多个制表符间距表示。现在,当我将其转换为csv文件时,我想在它们之间加上“n.a”,表示该记录字段中没有任何条目Python 统计tsv文件中的多个选项卡,python,parsing,csv,awk,tsv,Python,Parsing,Csv,Awk,Tsv,我试图解析一个巨大的tab受限文件(tsv文件),并将其转换为逗号分隔的值文件。 我遇到的问题是,tsv文件中并非所有条目都是完整的,其中一些条目是不完整的,并且由条目之间的多个制表符间距表示。现在,当我将其转换为csv文件时,我想在它们之间加上“n.a”,表示该记录字段中没有任何条目 例如,考虑学生记录样本(1个选项卡= 4个空格,忍受我的糟糕格式) 在上面的示例中,第一条记录表示字段标题,每一行都是一条记录。 我们可以观察到,Tom缺少“部门”字段条目,Kelsey缺少“GPA”字段条目。
例如,考虑学生记录样本(1个选项卡= 4个空格,忍受我的糟糕格式)
在上面的示例中,第一条记录表示字段标题,每一行都是一条记录。 我们可以观察到,Tom缺少“部门”字段条目,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) 请注意,“部门”字段下第二行“计算机”和“科学”之间的空格被忽略并保留。因此,生成的脚本不应该计算空格
完美地做到这一点非常重要,因为我将为搜索索引提供数据。提前感谢。这可以用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
这可以在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
只需在每行上使用split('\t')
>>> x="a\t\tb"
>>> x
'a\t\tb'
>>> print x
a b
>>> x.split("\t")
['a', '', 'b']
>>>
只需在每行上使用split('\t')
>>> x="a\t\tb"
>>> x
'a\t\tb'
>>> print x
a b
>>> x.split("\t")
['a', '', 'b']
>>>
在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()
应该可以工作,尽管它不是特别适合python。在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。单向使用
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
单向使用
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
$awk'NR>0{$1=$1}1'OFS=“,”FILENAME>OUTPUT_file恐怕我们在粘贴中看不到选项卡,所以您应该弄清楚在连续字段之间是否总是有一个选项卡。$awk'NR>0{$1=$1}1'OFS=“,”FILENAME>OUTPUT_file恐怕在粘贴中看不到选项卡,所以你应该弄清楚在连续的字段之间是否总是有一个标签。这是最好的解决方案。Thanks@crazyim5字体只是好奇:为什么是最好的?它使用的行数比我的多,虽然在逻辑上是一样的。@David他的代码只是通过复制粘贴和更改文件名来工作,而你的代码没有。这是一种冲动的反应。这是最好的解决办法。Thanks@crazyim5字体只是好奇:为什么是最好的?它使用的行数比我的多,虽然在逻辑上是一样的。@David他的代码只是通过复制粘贴和更改文件名来工作,而你的代码没有。这是一种冲动的反应。没关系:)太好了。非常感谢你。AWK是一个很酷的工具来做这些事情。太棒了。非常感谢你。AWK是一个很酷的工具来做这些事情。