2016-08-19 4 views
0

Python 3.4/3.2からtxtファイルにデータを出力する必要があります。 CT_TYPEの2つの以上の値がある場合、それらは、COL2及びCOL3と最後の値の両方に印刷しなければならない、同じID1について大きなデータをPythonの特別なフォーマットのファイルに出力する

col1 |  col2   | col3     | 
    id1  CT_TYPE value1 CT_TYPE value2 
    AR  CT1   239  CT2 9.66 
    AR  CT3   8.65 
    NY  CT1   6.25  CT2 67.89 
    NY  CT3   78.61 

ファイルの各行の形式はid1型のcol3を空にすることができます。たとえば、次の印刷形式が間違っています。

col1 |  col2   | col3     | 
    id1  CT_TYPE value1  CT_TYPE value2 
    AR  CT1  239   " this cannot be left as blank" 
    AR  CT2 9.66    CT3   8.65 

id1の値が異なる場合は、新しい行を追加する必要があります。たとえばFror、ID1 = NYはARと同じ行にすることはできません。

AR  CT3 8.65  NY  CT1 6.25 // this is not allowed. 

あり、印刷する必要のあるデータラインの数十万人。私は並べ替えを使用したくないのですが、データサイズが大きくてPythonのデータ構造に保持されるからです。だから、ブロックごとにデータベースからデータをロードしてファイルに出力する必要があります。データベースからロードされた各ブロックが同じid1値を持つことを確認できます。

私の質問は、データがブロック単位で印刷されるときに上記のフォーマットが保持されることを確認することですか? Pythonで、私が使用:同じID1タイプのCT_type値が同じ行にも十分に改行「\ n」の後に追加された時に印刷されるように

with open(fileName, 'a') as f: 
     f.wite(aLine + "\n"); 

どのように現在の印刷位置を変更します最後のデータラインが印刷された。私が欲しい

AR  CT2 9.66 

col1 |  col2   | col3     | 
    id1  CT_TYPE value1 CT_TYPE value2 
    AR  CT1  239  CT2 9.66 

ない:

col1 |  col2  | col3     | 
    id1  CT_TYPE value1 CT_TYPE value2 
    AR  CT1   239    
    AR  CT2  9.66 
新しいブロックに新たなデータラインが似ている

col1 |  col2   | col3     | 
    id1  CT_TYPE value1 CT_TYPE value2 
    AR  CT1  239 

:たとえば、私のファイルは、これらの持っている場合

ありがとうございました

答えて

0

私が問題を正しく理解していれば、IDと一致するものが見つかるまでidとcttypeのみを格納し、ファイルとメモリからdelに出力するまで何かを使用します。以下は図版になります

fobj_in = open('file','r') 
fobj_out = open('output','a') 
unmatched = {} 
for line in fobj_in: 
    elem = line.split('\t') 
    id1, cttype = elem 
    if id1 not in unmatched: 
     unmatched[id1] = cttype 
    else: 
     cttype_ = unmatched.pop(id1) 
     fobj.write('\t'.join([id1,cttype_, cttype])) 
for id in unmatched: 
    fobj.write('\t'.join([id, unmatched.pop(id)])) 
fobj_in.close() 
fobj_out.close() 

上記はあくまでも例示であり、間違いやその他の問題が発生する可能性があります。

関連する問題