0

以下のようなcsvファイルがあります

1,1  
2,2  
3,4  
4,5  
6,6

ご覧のとおり、列 1 から "5" が欠落しており、列 2 から "3" が欠落しています。
両方の列を比較して、"欠落している値" を挿入できるスクリプトを作成したいと思います。出力は次のようになります。

1,1  
2,2
3, value missing
4,4
value missing, 5
6,6  

どんな助けでも大歓迎です!
注: この例では数値を使用しましたが、実際の問題には、実際には意味のない文字列があります。

編集:以下に実際のデータのサンプルを含めました

HM999993,HM999993  
HM999995,HM999995  
HM999997,HM999997  
J04353,J04353  
JF800658,JF834523  
JF834523,JF906559  
JF906559,JN171845  
JN171845,K02718  
JN709469,M12732  
JN709470,M12737  
JN709471,M14119  
JN709472,M17463  
JQ754321,M20219  
4

3 に答える 3

2

これは、整数を使用したかなり単純なタスクです。ただし、文字列の使用はより複雑になります。整数を使用すると、2 つの数値を比較できます。一方が他方より高ければ、欠損値があることがわかります。文字列がアルファベット順に並べられていて、各文字で始まる文字列が 1 つしかない場合を除き、この単純な比較は文字列には使用できません。

各ファイルの行数を比較して欠落している文字列の総数を判断するだけの場合、質問で要求されているように、欠落している文字列の位置を特定する際に問題が発生します。

于 2012-07-07T15:50:47.463 に答える
1

さらに単純化する必要がありますが、うまくいくと思います:

#!/usr/bin/python
import csv

def navigation(iterable):
    iterator = iter(iterable)
    prev = None
    item = iterator.next()

    for next in iterator:
        yield (prev, item, next)
        prev = item
        item = next

    yield (prev, item, None)

with open('input.csv') as csv_input:
    with open('output.csv', 'w') as csv_output:
        old_data = []
        new_data = []

        for row in csv.reader(csv_input):
            old_data += row

        for index, (_prev, item, _next) in enumerate(navigation(old_data)):
            if _next != item:
                if _prev != item:
                    row = [item, 'missing value']
                    new_data.append(row if index % 2 == 0 else row[::-1])
            else:
                new_data.append([item, _next])

        writer = csv.writer(csv_output, delimiter=',', lineterminator='\n')
        writer.writerows(new_data)
于 2012-07-07T16:37:19.807 に答える
0

各列で期待される文字列の完全なリストを知らなければ、これは解決できないと思います。さもないと、

import csv

expected_in_A = set(['a','b','c','d'])
expected_in_B = set(['w','x','y','z'])

def main():
    with open('myfile.csv', 'rb+') as f:
        incsv = csv.reader(f)
        for row in incsv:
            expected_in_A.discard(row[0])
            expected_in_B.discard(row[1])

        # because the file opening mode included '+',
        # and because we have already read to the end of it,
        # we can now simply append to it:
        outcsv = csv.writer(f)
        outcsv.writerows([val, 'value missing'] for val in expected_in_A)
        outcsv.writerows(['value missing', val] for val in expected_in_B)

if __name__=="__main__":
    main()

myfile.csv含まれている場合

a,w
b,x
d,z

(z! に続くキャリッジ リターンを使用) すると、次のようになります。

a,w
b,x
d,z
c,value missing
value missing,y
于 2012-07-07T16:49:26.353 に答える