2015-09-12 67 views
0

我必須輸入一個包含逗號分隔和線分隔以下面的格式數據的文本文件:重新組織數據

A002,R051,02-00-00,05-21-11,00:00:00,REGULAR,003169391,001097585,05-21-11,04:00:00,REGULAR,003169415,001097588,05-21-11,08:00:00,REGULAR,003169431,001097607 

這樣的數據的多組存在於文本文件

我需要條件如下: 每個集合中的前3個元素後跟新的行中的5個參數。所以上面的組的解決方案將是:

A002,R051,02-00-00,05-21-11,00:00:00,REGULAR,003169391,001097585 
A002,R051,02-00-00,05-21-11,04:00:00,REGULAR,003169415,001097588 
A002,R051,02-00-00,05-21-11,08:00:00,REGULAR,003169431,001097607 

My功能來實現它在下面給出:

def fix_turnstile_data(filenames):  
    for name in filenames: 
     f_in = open(name, 'r') 
     reader_in = csv.reader(f_in, delimiter = ',') 
     f_out = open('updated_' + name, 'w') 
     writer_out = csv.writer(f_out, delimiter = ',') 

     array=[] 
     for line in reader_in: 
      i = 0 
      j = -1 
      while i < len(line): 
       if i % 8 == 0: 
        i+=2 
        j+=1 
        del array[:] 
        array.append(line[0]) 
        array.append(line[1]) 
        array.append(line[2]) 

       elif (i+1) % 8 == 0: 
        array.append(line[i-3*j]) 
        writer_out.writerow(array) 

       else: 
        array.append(line[i-3*j]) 

       i+=1 

     f_in.close() 
     f_out.close() 

輸出是錯誤的,在這些線的末端有3行的空間其長度是8.我懷疑它可能是writer_out.writerow(數組),這是怪罪。

任何人都可以幫我嗎?

回答

0

嗯,你使用的邏輯結果相當混亂。我會更多地沿着這些線(這取代你的for循環),這是更Pythonic:

for line in reader_in: 
    header = line[:3] 
    for i in xrange(3, len(line), 5): 
     writer_out.writerow(header + line[i:i+5]) 
+0

您的解決方案完美地工作。萬分感謝! 你能指出我錯在哪裏(爲了學習的目的)嗎? –

+0

當然!嗯,我不確定如何修復邏輯,所以它的工作方式,但你絕對不想開始'i%8 == 0'上的新行。你想開始一個新的'我'是3,8,13等等 - 每5個從3開始。你需要一些模塊5.但總的來說,你的方法很難跟蹤,因爲您必須更新的所有索引變量。儘可能地儘量做到儘量做大。 – Claudiu