2012-03-11 103 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