如何区分很长的csv和很长的txt

ua4mk5z4  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(87)

我有两个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


我真的不知道我应该如何继续在这里,因为我不习惯于差分文件,所以任何帮助将是最受欢迎的!
谢谢你的时间:)

1rhkuytd

1rhkuytd1#

我看到了类似于 * list suppression * 的内容:如果A中的某些行在B中不存在,则需要从A中删除它们。
在处理CSV文件时,使用真正的CSV解析器将使结果更加可靠。您可以用Python编写一个非常小的程序来实现这一点,或者您可以使用支持CSV的命令行工具,如GoCSV及其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

字符串
Join * 将CSV压缩在一起(除了连接逻辑之外),所以我们得到所有三列。
可以使用select子命令("extract specified columns")来修剪,join的输出可以 * piped * 到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


对于join,我们通过名称指定了"Item"列,因为它由两个文件共享。对于select,我们只需要指定第一列和第二列(1,2),因为名称"Item"是重复的。
只需重定向它以获得最终文件,在下面的示例中称为output.csv:

gocsv join -c Item beta.csv live.csv | gocsv select -c 1,2 > output.csv

insrf1ej

insrf1ej2#

可以在Miller中运行join

mlr --csv join -j  Item -f beta.csv then reorder -f NPC,Item live.csv >out.csv

字符串

NPC,Item
NPC 1,Item 1
NPC 2,Item 1
NPC 4,Item 1
NPC 2,Item 3
NPC 4,Item 5

相关问题