0

巨大なタブ限定ファイル(tsvファイル)をパースしてコンマ区切り値ファイルに変換しようとしています。私が抱えている問題は、tsv ファイル内のすべてのエントリが完全ではなく、一部のエントリが不完全なままで、エントリ間に複数のタブ スペースがあることです。これをcsvファイルに変換するとき、それらの間に「na」を入れて、レコードのそのフィールドにエントリがないことを示します。

たとえば、生徒の記録のサンプルを考えてみましょう (1 タブ = 4 スペース、書式設定が不十分であることはご容赦ください)。

Name    Age    Department    GPA
Kevin    21    Computer Science    3.4
Tom    20        3.8
Kelsey    22    Psychology        (2 tab spaces here)

上記の例では、最初のレコードはフィールドのタイトルを示し、すべての行がレコードです。Tom の「Department」フィールドのエントリがなく、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 など、どのスクリプトでも可能
です。したがって、結果のスクリプトはスペースを数えるべきではありません。

検索インデックス作成のためにデータをフィードすることになるため、これを完全に行うことは非常に重要です。前もって感謝します。

4

4 に答える 4

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
于 2012-08-10T22:09:04.520 に答える
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"
于 2012-08-10T22:15:25.417 に答える
0

各行でsplit('\ t')を使用するだけです...

>>> x="a\t\tb"
>>> x
'a\t\tb'
>>> print x
a               b
>>> x.split("\t")
['a', '', 'b']
>>>
于 2012-08-10T22:11:24.047 に答える
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ではありませんが、動作するはずです。

于 2012-08-10T22:12:55.217 に答える