Python 统计tsv文件中的多个选项卡

Python 统计tsv文件中的多个选项卡,python,parsing,csv,awk,tsv,Python,Parsing,Csv,Awk,Tsv,我试图解析一个巨大的tab受限文件(tsv文件),并将其转换为逗号分隔的值文件。 我遇到的问题是,tsv文件中并非所有条目都是完整的,其中一些条目是不完整的,并且由条目之间的多个制表符间距表示。现在,当我将其转换为csv文件时,我想在它们之间加上“n.a”,表示该记录字段中没有任何条目 例如,考虑学生记录样本(1个选项卡= 4个空格,忍受我的糟糕格式) 在上面的示例中,第一条记录表示字段标题,每一行都是一条记录。 我们可以观察到,Tom缺少“部门”字段条目,Kelsey缺少“GPA”字段条目。

我试图解析一个巨大的tab受限文件(tsv文件),并将其转换为逗号分隔的值文件。 我遇到的问题是,tsv文件中并非所有条目都是完整的,其中一些条目是不完整的,并且由条目之间的多个制表符间距表示。现在,当我将其转换为csv文件时,我想在它们之间加上“n.a”,表示该记录字段中没有任何条目

例如,考虑学生记录样本(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是一个很酷的工具来做这些事情。