2012-03-11 7 views
0

から項目をマージ:/Pythonは、私は通常の形式のファイルを持っている場合、それはこのように、大丈夫だ二列

期間終了日9月30日/ 6月30日/ 3月31日/ 12月31日/ 9月30日

   2012 2012 2012 2011 2011 

それから私は、zipやprint "%s%s" % (row_1[j], row_2[j])

することにより、これらの日付をマージすることができます。しかし、時々私はこのような不規則な入力があります。

期間終了日2012年9月30日6月30日/ 2011年3月31日12月31日/ 2012年9月30日

     2011   2010 

またはこの:

期間終了日付は9月30日/ 6月30日/ 2011年3月31日2011年12月31日2012年9月30日

   2012 2011    

ので、最終日はrow_のマージです1行2列の場合、問題はどのように線量Pythonがどの列であるかを知ることです。私はこれにどのようにアプローチすべきですか?そんなに感謝します!

答えて

0

これはさまざまな方法があり、それぞれが異なる入力クラスに一般化されています(このように)。どの程度:

(あなたの3例のために)与え
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 

['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は、line1の各単語にループし、/で分割しようとします。それが3つの部分を生成するならば、それは日付だと仮定します。もしそうならば、日付の最後の部分が空でない場合は日付を返し、それ以外の場合は、単語とline2の最初の項の和を返します。これはline2を必要としない場合は使用しません。 line2.pop(0)は、「行2の最初の要素を取り出して削除する」という意味です。

+0

アメージング私はちょうどよ...この回答に投票するには新鮮すぎる!感謝し、多くを学んだ! –

+0

質問、 日付=リスト(dates_from_two(行、次の行)) なぜあなたはdates_from_two()で "return"を定義しませんでしたが、この関数はwordを返しますか?キーワード "収穫"のため? –

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

ありがとう、本当に感謝します! –