2014-05-22 66 views
2

我有一個txt文件的數據集,其中每行包含4個數據點,由空格分隔。由於收集數據時出現一些錯誤,有些行會分成兩行,並會顯示一些空格而不是實際的數據。因此,輸入應該是這樣的:條件後合併行

data data data data 
data data data data 
data data data data 

,但事實上確實是這樣的(第二行有最終三個空間,並與三個空格第三次首發):

data data data data 
data data 
    data 
data data data data 

我想爲缺失的數據添加「n/a」,並在第二個示例中將第二行和第三行合併爲一行。最後我想把它保存爲一個新文件。

這是我的嘗試:

f1 = open("pilTest.txt","r") 
f2 = open("pilFix.txt", "w") 
stop = 0 
for line in f1: 
    # Loop over each word in line 
    words = line.split(" ") 
    for i in range(len(words)): 
     if len(words[i])!=0: 
      f2.write(words[i]) 
      f2.write(" ") 
     elif stop==0:    
      f2.write("n/a") 
      f2.write(" ") 
      stop = 1 

建議?

我得到的是

data data data data 
data data n/a 
data 
data data data data 

所需的輸出是

data data data data 
data data n/a data 
data data data data 
+4

它,它不工作?如果是這樣怎麼不起作用?它(不)做什麼?你期望它做什麼,它做了什麼? –

+0

它不工作。它在第二行後輸出一個「n/a」,但我無法將第三行添加到第二行。我將添加所需的輸出。 –

+0

你知不知道它總是第三列「n/a」去哪?或者,您是否從第二列之後的換行符以及下一行前面的額外空格處獲得了這些信息? – Evert

回答

1

如果有一些關於空間顯著,你可能要分析這些。另外,工作的假設,當數據丟失的那張錯誤出現,而且它會在虛線的中間缺失,在缺失數據填充追溯可能的工作:

f1 = open("pilTest.txt","r") 
f2 = open("pilFix.txt", "w") 

_last_words = [] 
_expected_length = 4 
for line in f1: 
    words = line.split() 
    if len(words) != _expected_length: 
     if _last_words: 
      blanks = _expected_length - (len(_last_words) + len(words)) 
      f2.write(' '.join(_last_words + ['n/a']*blanks + words) + '\n') 
      _last_words = [] 
     else: 
      _last_words = words 
    else: 
     f2.write(line) 

f2.close() 
+0

哇,謝謝!如果len(words)!= _expected_length: 到 如果len(words)<= _expected_length,那麼實際的數據點可能是從0或1到字符串(無空格)的任何東西,所以我將_expected_length更改爲1和 : –

+0

好的,它幾乎解決了這個問題。 「第三行」沒有出現,我沒有「不適用」。我會再次檢查代碼。如果我沒有詳細說明問題,我很抱歉。 –

+0

我應該澄清一下_expected_length是指你期望在一行上有多少元素,而不是元素多長 - 「數據」是四個字符長是巧合。 – dabhaid