【问题标题】:Compare two CSV files against a master CSV file and merge the results into a new file将两个 CSV 文件与一个主 CSV 文件进行比较,并将结果合并到一个新文件中
【发布时间】:2013-11-05 03:56:13
【问题描述】:

我有 3 个 CSV 文件。我有一个主 CSV 文档,其中包含我以后需要的大部分信息。但是缺少其他两个 CSV 文档中的数据。目标是将主文档与其他每个 CSV 进行比较,从 2 个 CSV 中提取指定数据并将该信息添加到主 CSV 中的行。最后将它们写入一个新文件。

这是我到目前为止所得到的,并不是说它有效。

inv = 是主文档,它包含我需要的 99% 的信息

vb = 与 inv 的 '\xef\xbb\xbfPART_CODE' 有共同的 'PART CODE',我需要将它的 'ON-HAND' 添加到 inv 的行中

ma​​in = 与 inv 的 '\xef\xbb\xbfPART_CODE' 有共同的 'PART CODE',我需要将它的 'ON-HAND' 添加到 inv 的行中

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

第一个问题:

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'

第二个问题:

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

如前所述,抱怨 KeyError。如果我只是打印 i,它会显示 i 的键/值在那里,它会报告 'VB': '0' 等。

我对编程仍然很陌生,一个星期以来每晚都在这个时间工作,但我已经气馁了。但还不足以放弃!

【问题讨论】:

  • 我不确定我是否完全理解您的问题。你有你的 inv 文件,它有一个“ON-HAND”列。我将您的问题解释为您想用 main 或 vb 的结果填充“PART CODE”列是否正确,具体取决于哪个与 inv 共享 ON-HAND 值?
  • INV not 有手头,dictline2['VB'] = dictline1['ON-HAND'] 正在将字典键和值添加到从投资。
  • 如果您要使用表格数据,您应该查看pandas 库。它使合并和对齐数据变得更加容易。

标签: python python-2.7 csv dictionary


【解决方案1】:

首先,我认为您打算缩进附加语句,以便它们出现在每个内部循环文字中:

    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

【讨论】:

  • 缩进最初在正确的位置,按照您的建议进行了尝试,它会抱怨在原始位置以外的所有其他位置出现意外缩进。您共享 [:10] 以打印前 # 行是一个巨大的帮助。现在我可以看到我的失败几乎立即发生,而不是每 2 分钟发生一次。
  • 将两个字典转换为列表也是一个很好的技巧。现在我可以可靠地调用 i['VB'] 了。仍然存在 if then 循环将所有内容分配给 0 的问题。
【解决方案2】:

我得到了这个工作!这有点笨拙,但就我的目的而言,我认为我可以让这一切正常运行。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2018-03-30
    • 2023-01-31
    相关资源
    最近更新 更多