2012-08-10 74 views
0

我想解析一個巨大的選項卡有限文件(TSV文件),並將其轉換爲逗號分隔值文件。 我遇到的問題是tsv文件中的所有條目都不完整,其中一些條目不完整,並且由條目之間的多個製表符間隔表示。現在,當我將它轉換爲csv文件時,我希望它們之間有「n.a」,表示該記錄的該字段中沒有任何條目。計數多個選項卡tsv文件

例如,考慮學生記錄樣品(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任何腳本都可以做
2)觀察在'department'字段下的第二行中的單詞「Computer」&「Science」之間的空間被忽略和保留。所以生成的腳本不應該計入空格。

完成此操作非常重要,因爲我將爲搜索索引提供數據。提前致謝。

+0

$ AWK 'NR> 0 {$ 1 = $ 1} 1' OFS = 「」 FILENAME> OUTPUT_FILE – crazyim5 2012-08-10 22:07:45

+0

恐怕我們並沒有真正看到你貼上的標籤,所以你應該清楚在連續字段之間是否總是有一個標籤。 – 2012-08-10 22:10:30

回答

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 
0

使用只是在每一行,用split( '\ t')...

>>> x="a\t\tb" 
>>> x 
'a\t\tb' 
>>> print x 
a    b 
>>> x.split("\t") 
['a', '', 'b'] 
>>> 
0

在蟒蛇,

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

+0

這是最好的解決方案。謝謝 – crazyim5 2012-08-10 22:25:45

+0

@ crazyim5:只是好奇:爲什麼最好?它使用比我的更多的線,儘管在邏輯上它是相同的。 – 2012-08-11 01:30:37

+0

@David他的代碼只是通過複製粘貼它,而只是通過改變文件名,而你的代碼沒有。這是一個衝動的迴應。沒關係:) – crazyim5 2012-08-13 16:27:36

1

一種方式:

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" 
+0

優秀。非常感謝你。 AWK是一個很酷的工具來完成這些東西。 – crazyim5 2012-08-10 22:27:37

相關問題