2012-03-11 92 views
0

這是確定的,如果我有正規格式的文件,如:Python的合併項目從兩行

期間結束日期9月30日/ 06/30/3月31日/ 12月31日/ 09/30/

   2012 2012 2012 2011 2011 

然後我就可以通過拉鍊或合併這些日期print "%s%s" % (row_1[j], row_2[j])

但有時我有不規則的輸入是這樣的:

期間結束日期二零一二年九月三十〇日6月30日/ 2011年3月31日31分之12/二零一二年九月三十〇日

     2011   2010 

或該:

期末日期9月30日/ 06/30/2011年3月31日12/31/2011二零一二年九月三十零日

   2012 2011    

所以最後日期是row_的合併1和row2列,問題是python如何知道它是哪一列。我應該如何處理這個問題?非常感謝!

回答

0

有很多方法可以做到這一點,每一種方法都可以推廣到不同類別的輸入 - 就像這樣。如何:

def dates_from_two(line1, line2): 
    line2 = line2.split() 
    for word in line1.split(): 
     wsplit = word.split('/') 
     if len(wsplit) == 3: 
      yield word if wsplit[-1] else (word + line2.pop(0)) 

with open("period.txt") as fp: 
    lines = fp.readlines() 
    for i, line in enumerate(lines): 
     if line.startswith("Period End Date"): 
      next_line = lines[i+1] if i+1 < len(lines) else '' 
      dates = list(dates_from_two(line, next_line)) 
      print dates 

這給(你的3起):

['09/30/2012', '06/30/2012', '03/31/2012', '12/31/2011', '09/30/2011'] 
['09/30/2012', '06/30/2011', '03/31/2011', '12/31/2010', '09/30/2012'] 
['09/30/2012', '06/30/2011', '03/31/2011', '12/31/2011', '09/30/2012'] 

基本上,上面寫明所有的線到內存(不是必須的,但更簡單,如果文件不是太大)並在其上循環,尋找以「期末日期」開頭的行。如果它找到一個,它將發送該行,而下一個發送到dates_from_two。

dates_from_two只是簡單地遍歷第1行中的每個單詞並嘗試將其按/拆分。如果這產生三個部分,我們將假定它是一個日期。如果是這樣,那麼如果日期的最後一部分是非空的,那麼我們就得出日期,否則我們得出該單詞加上第一行的總和(我們彈出)。如果我們從不需要行2,我們就不會使用它。請注意,line2.pop(0)表示「採用line2的第一個元素,然後刪除它」。

+0

驚人......我只是太新鮮了,無法投票回答這個問題!欣賞並學到很多東西! – 2012-03-11 04:45:48

+0

問題, dates = list(dates_from_two(line,next_line)) 爲什麼你沒有在dates_from_two()中定義「return」,但是這個函數返回的是單詞?由於關鍵字「收益」?? – 2012-03-11 04:53:20

0

你可以這樣說:

import sys 
import re 

f = open("test1_file") 
row_1 = f.readline() 
row_2 = f.readline() 

print row_1,row_2 

row_1 = row_1.split() 
row_1 = row_1[3:] 

row_2 = row_2.split() 
row_2.reverse() 
r = re.compile(".+/.+/.+") 
dates = [] 
for date in row_1: 
    if r.search(date) is None: 
     new_date = date+row_2.pop() 
     dates.append(new_date) 
    else: 
     dates.append(date) 

print dates 

當你在問題中給出的樣本文件中的一箇中運行,可以得到以下輸出:

Period End Date 09/30/2012 06/30/ 03/31/2011 12/31/ 09/30/2012 
          2011   2010 

['09/30/2012', '06/30/2011', '03/31/2011', '12/31/2010', '09/30/2012'] 
+0

非常感謝,非常感謝! – 2012-03-11 04:52:50