【问题标题】:Merging multiple CSV files based on columns [closed]基于列合并多个 CSV 文件 [关闭]
【发布时间】:2019-07-13 03:03:57
【问题描述】:

我有以下 3 个 CSV 文件。我想根据列合并它们。 前 2 列的组合将是唯一标识符。

我可以使用任何脚本语言,但性能应该不错。

文件 1:

文件 2:

文件 3:

输出:

以文本格式输出用于测试:

abc,xxx,a1,b1,c1,p1,q1,r1,x3,y3,z3

abc,yyy,a2,b2,c2,p2,q2,r2,x4,y4,z4

def,zzz,a3,b3,c3,p3,q3,r3,x1,y1,z1

def,pqr,a4,b4,c4,p4,q4,r4,x2,y2,z2

【问题讨论】:

  • 你的代码的问题是......?
  • 请在您的问题中将您的数据发布为 CSV 文本,而不是图片。使复制和粘贴变得更加容易,因此我们可以测试解决方案。
  • 您的最后一列不匹配!
  • 前 2 列的组合将是唯一标识符,但您的文件中有多个 (def,pqr) 行...
  • perl 中,该工作的工具是"hash slice"。试一试,看看你们相处得如何。

标签: python linux bash perl awk


【解决方案1】:

根据提供的信息,以下代码应该适合您:

cat file1.csv file2.csv file3.csv | awk -F, '![$1$2]++' > out_file.csv

注意- 如果任何文件中的列多于 2 列,则与唯一标识符第一次出现对应的数据(即前 2 列的组合)将出现在输出文件中。

【讨论】:

  • 那不会做OP想要的;它只是打印出具有唯一前两列的第一行,不合并这两列共享相同值的行...
  • 你需要一个数组变量名。 [$1$2] 本身就是一个语法错误。
  • 在我发布答案后看到了来自 OP 的更新。也会更新答案。而且,那段代码没有任何错误,尽管现在已经无关紧要了。
  • 它肯定有一个错误——至少在 gawk 和 mawk 和 nawk 上是这样。你在使用其他的 awk 实现吗?
  • 我不是系统程序员。但是,我只知道它对我有用。我一直在通过探索和尝试来学习东西。我在 Linux 和 MAC 命令行上使用过几次。
【解决方案2】:

由于缺乏可用的测试数据以及图像中的内容与您对唯一键的数据描述不匹配而完全未经测试,但由于合并多个表基本上是一个数据库问题,这里有一个使用 sqlite 的脚本来做所有繁重的工作:

#!/bin/sh
# Usage: ./join.sh filea.csv fileb.csv filec.csv

filea=$1
fileb=$2
filec=$3

sqlite3 -batch -noheader -csv <<EOF
CREATE TABLE a(element, identifier, a1, a2, a3
             , PRIMARY KEY(element, identifier)) WITHOUT ROWID;
CREATE TABLE b(element, identifier, b1, b2, b3
             , PRIMARY KEY(element, identifier)) WITHOUT ROWID;
CREATE TABLE c(element, identifier, c1, c2, c3
             , PRIMARY KEY(element, identifier)) WITHOUT ROWID;
.import "$filea" a
.import "$fileb" b
.import "$filec" c
SELECT a.element, a.identifier, a1, a2, a3, b1, b2, b3, c1, c2, c3
FROM a
JOIN b ON a.element = b.element AND a.identifier = b.identifier
JOIN c ON a.element = c.element AND a.identifier = c.identifier
ORDER BY a.element, a.identifier;
EOF

(旁注:伙计,我希望join(1) 支持多字段键)

【讨论】:

    【解决方案3】:

    将第一个文件读入一个散列(Python 称之为dict),以前两列的组合为键

    将第二个文件读入相同的散列,也由前两列的组合作为键。您需要决定如何合并同一列的变体数据

    重复第三个文件。

    Text::CSV是你的朋友....

    【讨论】:

      【解决方案4】:

      查看熊猫库。 .merge 应该给你你需要的东西,但很难说,因为你还没有发布任何代码。无论如何:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

      【讨论】:

        猜你喜欢
        • 2014-01-29
        • 2021-09-27
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 2016-01-16
        相关资源
        最近更新 更多