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

问题描述 投票:0回答:1

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

我真的不知道应该如何继续这里,因为我不习惯比较文件,所以非常欢迎任何帮助!

感谢您的宝贵时间:)

list csv compare diff txt
1个回答
0
投票

我看到的就像列表抑制:如果 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
    
© www.soinside.com 2019 - 2024. All rights reserved.