gpt4 book ai didi

python - 通过多列中的非唯一值比较两个 csv 文件,输出到匹配的 csv 额外数据

转载 作者:太空宇宙 更新时间:2023-11-03 15:01:49 24 4
gpt4 key购买 nike

我已经用完了搜索词,又回到原点。我已经阅读并尝试了大量的问题和答案,我认为这是一个相当简单的任务,但没有乐趣。

我有两个 csv 文件。

**file1.csv** (2,000 + lines)<br/>
product_code, colour, size, sku, more cols..., barcode<br/>
<span style="color: red">
item98, red, XL, adfd56384678, ..., null<br/>
item99, black, L, adfgk9087467, ..., null<br/>
item98, red, S, adfgad240568, ..., null<br/>
</span>

**file2.csv** (20,000 + lines)<br/>
ITEM_CODE, COLOUR, SIZE, BAR_CODE<br/>
<span style="color: red">
item98, RED, XL, 090900887<br/>
item98, RED, S, 43581034<br/>
item97, BLUE, M, 519685371<br/>
</span>

我需要输出:

**matched-result.csv** (2,000 + lines)<br/>
product_code, colour, size, sku, more cols..., barcode<br/>
<span style="color: red">
item98, red, XL, adfd56384678, ..., 090900887<br/>
item99, black, L, adfgk9087467, ..., null<br/>
item98, red, S, adfgad240568, ..., 519685371<br/>
</span>

sku 和条形码是唯一值,只能通过匹配产品代码、尺寸和颜色来识别。我需要 file1.csv 末尾的新列中的条形码。我的第一次成功尝试是使用 awk。

<pre>
awk -F',' -v OFS=, 'NR==FNR{a[$1,tolower($2),$3]=$4;next}{if( b = a[$1,tolower($2),$3]){ print $1,$2,$3,$4,b }}' file1.csv file2.csv > matched-result.csv
</pre>

我很难输出整个 file1.csv 的结果,尝试 print $0,b 创建了一个值为 b 的新行。我还希望所有 file1.csv 输出都包含不匹配的空值和头部(如果可能)。我必须对齐列以匹配这种 awk 方法的工作,但原始字段不对齐。这没什么大不了的,但我想知道是否有必要解决这个问题?

之后,我尝试使用 python 脚本将 file1.csv 与 awk 输出文件 ma​​tched-result.csv 合并。

    import csv    from collections import OrderedDict    with open('file1.csv') as f:        r = csv.reader(f, delimiter=',')        dict1 = {row[0]: row[1:] for row in r}    with open('matched-result.csv') as f:        r = csv.reader(f, delimiter=',')        dict2 = OrderedDict((row[0], row[1:]) for row in r)    result = OrderedDict()    for d in (dict1, dict2):        for key, value in d.iteritems():            result.setdefault(key, []).extend(value)    with open('desired-result.csv', 'wb') as f:        w = csv.writer(f)        for key, value in result.iteritems():            w.writerow([key] + value)

输出不是期望的结果。顺序错误记录数与file1.csv不完全匹配是否有多余行?另外,这两个步骤的方法似乎脱节,感觉如果做得正确,其中一个可以完成这项工作?

我尝试使用 csvkit 来加入/合并文件,但输出了 20,000 多行,其中一些是重复的。我认为它将 Product_code/ITEM_CODE 列视为唯一值,但事实并非如此。我研究过 join 和 grep 但它们似乎也不是答案。

我已经安装了 panda 和 powerShell,并愿意尝试一下,但不知道从哪里开始,那里需要明确的说明。哦,我对所有这些语言和程序都是菜鸟,但还没有完全了解。

希望我已经提供了足够的信息来继续。我会发布我读过的帖子的链接。你可以认为我的工作是+90%。

请回复,提供代码示例,最好不是全新的语言或方法。

//更新

我投票给了 @zwer答案是因为它或多或少对框栏进行了微小的调整,请参阅评论。但值得指出的是@RavinderSingh13 awk 方法也可以得到相同的结果。我会追求@acushner当/如果我收到回复并更新这一点时, Pandas 方法。

如果有人关心的话,我认为这是最好的方法? Tomayto,tomarto,不确定是否可以打印。个人认为,python 更容易阅读。 Awk 很好而且简短,我认为它是一种基于正则表达式的语言,我发现它更难理解并且学习曲线更陡峭。

感谢所有发表评论的人。我为此苦苦思索了很长时间,并很快就在这里解决了。

最佳答案

我相信您的输出存在一些不一致,如果我们考虑 $1、$2 和 $3 作为 file2.csv 文件的索引,理想情况下显示输出的最后一行不应该存在。

如果是,这是一个拼写错误,那么以下内容可能会对您有所帮助。

awk -F", " 'FNR==NR{;a[$1,tolower($2),$3]=$NF;next} (($1,$2,$3) in a){$NF=a[$1,$2,$3]} 1' file2.csv file1.csv

编辑:由于OP在Input_file(s)中控制了M个字符,所以现在也添加以下内容。

awk -F", " '{gsub('/\r/',"")} FNR==NR{;a[$1,tolower($2),$3]=$NF;next} (($1,$2,$3) in a){$NF=a[$1,$2,$3]} 1' file2.csv file1.csv

关于python - 通过多列中的非唯一值比较两个 csv 文件,输出到匹配的 csv 额外数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45018892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com