我有两个 CSV:
beta.csv:其中多个NPC拥有多个物品(部分物品目前无效)
NPC,Item
NPC 1,Item 1
NPC 1,Item 2
NPC 2,Item 1
NPC 2,Item 3
NPC 3,Item 2
NPC 4,Item 1
NPC 4,Item 4
NPC 4,Item 5
live.csv:当前有效项目的列表:
Item
Item 1
Item 3
Item 5
由于 live.csv 中不存在第 2 项和第 4 项,我想删除 beta.csv 中包含这些项目的任何行。
我希望结果 CSV 看起来像:
NPC,Item
NPC 1,Item 1
NPC 2,Item 1
NPC 2,Item 3
NPC 4,Item 1
NPC 4,Item 5
我真的不知道应该如何继续这里,因为我不习惯比较文件,所以非常欢迎任何帮助!
感谢您的宝贵时间:)
我看到的就像列表抑制:如果 B 中不存在某些行,您想从 A 中删除这些行。
处理 CSV 文件时,使用真正的 CSV 解析器将使结果更加可靠。您可以用 Python 编写一个非常小的程序来完成此操作,或者您可以使用支持 CSV 的命令行工具,例如 GoCSV 及其 join 子命令。
Join “根据列中元素的相等性,使用内连接(默认)、左连接、右连接或外连接连接两个 CSV。”。
在您的情况下,仅当两个文件中都存在 Item 时,默认内部联接才会保留行。由于 live 是 beta 的子集,因此在确定要包含 beta 中的哪些行时,live 将成为限制因素:
gocsv join -c Item beta.csv live.csv
NPC,Item,Item
NPC 1,Item 1,Item 1
NPC 2,Item 1,Item 1
NPC 2,Item 3,Item 3
NPC 4,Item 1,Item 1
NPC 4,Item 5,Item 5
将 zips CSV 连接在一起(除了连接逻辑之外),这样我们就可以获得所有三列。
可以使用 select 子命令(“提取指定列”)进行修剪,并且 join 的输出可以通过 管道传输到 select:
gocsv join -c Item beta.csv live.csv | gocsv select -c 1,2
NPC,Item
NPC 1,Item 1
NPC 2,Item 1
NPC 2,Item 3
NPC 4,Item 1
NPC 4,Item 5
对于连接,我们按名称指定了“Item”列,因为它由两个文件共享。对于选择,我们只需要指定第一列和第二列(1,2
),因为名称“Item”重复了。只需重定向即可获取最终文件,在以下示例中称为output.csv:
gocsv join -c Item beta.csv live.csv | gocsv select -c 1,2 > output.csv