1

3 つの CSV ファイルがあります。後で必要になる情報の大部分を保持する 1 つのマスター CSV ドキュメントがあります。しかし、他の 2 つの CSV ドキュメントのデータが欠落しています。目標は、マスター ドキュメントを他の各 CSV と比較し、2 つの CSV から指定されたデータを取得して、その情報をマスター CSV の行に追加することです。最後にそれらを新しいファイルに書き込みます。

これが私がこれまでに得たものであり、機能するわけではありません。

inv = マスター ドキュメントです。必要な情報の 99% が含まれています。

vb = inv の '\xef\xbb\xbfPART_CODE' と共通の 'PART CODE' を持っています。inv の行に 'ON-HAND' を追加する必要があります

main = inv の '\xef\xbb\xbfPART_CODE' と共通の 'PART CODE' を持っています。inv の行に 'ON-HAND' を追加する必要があります

import csv

inv = csv.DictReader(open('ireport.txt', 'rU'), dialect='excel-tab', delimiter="\t")
vb = csv.DictReader(open('vb.txt', 'rU'), dialect='excel-tab', delimiter="\t")
main = csv.DictReader(open('main.txt', 'rU'), dialect='excel-tab', delimiter="\t")

vblist = []
mainlist = []

def vbfunc(dictreader1, dictreader2):
        dictreader2 = list(dictreader2)
        for dictline1 in dictreader1:
            for dictline2 in dictreader2:
                if dictline1['PART CODE'] == dictline2['\xef\xbb\xbfPART_CODE']:
                    dictline2['VB'] = dictline1['ON-HAND']
                else:
                    dictline2['VB'] = "0" 
        vblist.append(dictline2)

def mainfunc(dictreader1, dictreader2):
        dictreader2 = list(dictreader2)
        for dictline1 in dictreader1:
            for dictline2 in dictreader2:
                if dictline1['PART CODE'] == dictline2['\xef\xbb\xbfPART_CODE']:
                    dictline2['MAIN'] = dictline1['ON-HAND']
                else:
                    dictline2['MAIN'] = "0"
        mainlist.append(dictline2)

vbfunc(vb,inv)
#mainfuc(main,inv)   #I'll get to this when the other function works

for i in vblist:
    print i['VB']  #complains of KeyError: VB

1 番目の問題:

if dictline1['PART CODE'] == dictline2['\xef\xbb\xbfPART_CODE']:
    dictline2['VB'] = dictline1['ON-HAND']
else:
    dictline2['VB'] = "0"

リストに追加されると、すべての結果が「0」として扱われます。else: dictline2['VB'] = "0" の部分を省略すると、期待どおりに報告されます。しかし、そのままにしておくと、後で i['VB'] を印刷しようとすると KeyError: 'VB' が表示されます。

2番目の問題:

for i in vblist:
    print i['VB']  #complains of KeyError: VB

述べたように、KeyError を訴えます。単純に print i を実行すると、i のキー/値がそこにあることが表示され、'VB': '0' などと報告されます。

私はまだプログラミングに非常に慣れていません.1週間、毎晩この時間にいて、落胆しています. しかし、あきらめるには十分ではありません!

4

2 に答える 2

0

まず、append ステートメントをインデントして、内側のループ リテレーションごとに発生するようにするつもりだったと思います。

    for dictline1 in dictreader1:
        for dictline2 in dictreader2:
            if dictline1['PART CODE'] == dictline2['\xef\xbb\xbfPART_CODE']:
                dictline2['VB'] = dictline1['ON-HAND']
            else:
                dictline2['VB'] = "0" 
            vblist.append(dictline2)    #indented

それを超えて、あなたが提供した説明から問題を解析するのは少し難しいです. データが期待どおりに実際に処理されていることを確認するために、各段階で数行を出力することをお勧めします。たとえば、dictline1 もリストに変換すると、各ファイルの小さなスライスを取得できます。

def vbfunc(dictreader1, dictreader2):
    #iterate over 5 rows each
    dictreader1 = list(dictreader1)[:5] 
    dictreader2 = list(dictreader2)[:5]

    for dictline1 in dictreader1:
        for dictline2 in dictreader2:

            #print what's being read... 
            print '\nLines 1, 2', dictline1, dictline2
            print '\nColumns 1, 2', dictline1['PART CODE'], dictline2['\xef\xbb\xbfPART_CODE']

            if dictline1['PART CODE'] == dictline2['\xef\xbb\xbfPART_CODE']:
                dictline2['VB'] = dictline1['ON-HAND']
            else:
                dictline2['VB'] = "0" 

            #print the modified line
            print '\n New line 2', dictline2
            vblist.append(dictline2)    #indented

print '\n Modified lines ', vbList[:10] #print first 10 rows of output together

上記を過ぎて大量のデータを処理している場合は、具体的に次のように KeyErrors をキャッチすることもできます。

for row in vbList:
    try:
        print row['VB']
    except KeyError:
        print row
于 2013-11-05T06:14:25.797 に答える
0

私はこれを働かせました!少し厄介ですが、私の目的のためには、これをすべて動作させることができると思います。

import csv

inv = csv.DictReader(open('ireport.txt', 'rU'), dialect='excel-tab', delimiter="\t")
vb = csv.DictReader(open('vb.txt', 'rU'), dialect='excel-tab', delimiter="\t")
main = csv.DictReader(open('main.txt', 'rU'), dialect='excel-tab', delimiter="\t")


def vbfunc(dictreader1, dictreader2):
        dictreader2 = list(dictreader2)
        dictreader1 = list(dictreader1)
        vblist = []
        for dictline1 in dictreader1:
            for dictline2 in dictreader2:
                if dictline1['PART CODE'] == dictline2['\xef\xbb\xbfPART_CODE']:
                    dictline2['VB'] = dictline1['ON-HAND']
                else:
                    continue
        vblist.append(dictline2)
    for i in vblist:
        print i['BARCODE'],i['VB']

def mainfunc(dictreader1, dictreader2):
        dictreader2 = list(dictreader2)[:5000]
        dictreader1 = list(dictreader1)[:5000]
        mainlist = []
        for dictline1 in dictreader1:
            for dictline2 in dictreader2:
                if dictline1['PART CODE'] == dictline2['\xef\xbb\xbfPART_CODE']:
                    dictline2['MAIN'] = dictline1['ON-HAND']
                else:
                    continue
        mainlist.append(dictline2)
    for i in mainlist:
        print i['BARCODE'],i['MAIN']


vbfunc(vb,inv)
mainfunc(main,inv)
于 2013-11-05T13:04:50.297 に答える