有没有办法在 Excel 中对两个 csv 文件进行内连接?

有没有办法在 Excel 中对两个 csv 文件进行内连接?

这似乎是一个简单的概念,但我无法找到不编写代码就能做到这一点的方法。Excel 是否有一个函数可以让我基于共享 ID 列连接来自两个不同 csv 文件(例如 Orders 和 OrderDetails)的列,并创建一个包含两个列的复合 csv?

答案1

这在 MSQuery 中是可能的,尽管你必须在 ODBC 中设置数据源 在此处输入图片描述

这不是一个函数,但你应该发现它相对容易实现。帮助也提供了关于完成不同连接的文档

在此处输入图片描述

msquery 创建的结果 SQL 为: 在此处输入图片描述

答案2

我不会使用 Excel 来完成这项任务。相反,我会使用一个名为 的命令行程序join.exe。这就是它被设计用来做的事情。它是Unx更新.zip

语法很简单:

用法:加入 [选项]... 文件1 文件2
对于每对具有相同连接字段的输入行,写入一行
标准输出。默认连接字段是第一个分隔的
按空格。当 FILE1 或 FILE2(不能同时)为 - 时,读取标准输入。

  -a FILENUM 打印来自文件 FILENUM 的不可配对行,其中
                      FILENUM 为 1 或 2,对应 FILE1 或 FILE2
  -e EMPTY 用 EMPTY 替换缺失的输入字段
  -i, --ignore-case 比较字段时忽略大小写的差异
  -j FIELD 相当于 `-1 FIELD -2 FIELD'
  -o FORMAT 在构建输出行时遵循 FORMAT
  -t CHAR 使用 CHAR 作为输入和输出字段分隔符
  -v FILENUM 类似于 -a FILENUM,但抑制连接的输出行
  -1 FIELD 连接文件 1 的这个FIELD
  -2 FIELD 连接文件 2 的这个FIELD
      --help 显示帮助并退出
      --version输出版本信息并退出

除非给出 -t CHAR,否则前导空格将分隔字段并被忽略,
其余字段用 CHAR 分隔。任何 FIELD 都是一个字段编号,
从 1. FORMAT 是一个或多个逗号或空格分隔的规范,
每个都是“FILENUM.FIELD”或“0”。默认格式输出连接字段,
FILE1 中的剩余字段、FILE2 中的剩余字段、全部
用CHAR分隔。

重要提示:FILE1 和 FILE2 必须按连接字段排序。

最后一行非常重要!在这个相同的 zip 文件中,包含sort.exe可以为您排序文件的内容。或者您也可以使用 Excel 对文件进行排序。

答案3

是的,有。虽然有点不方便,但比编写代码好多了。

例子:

  • 组 1 = 爱丽丝、鲍勃、查理、埃科、狐步舞、利马
  • Set2 = 鲍勃、查理、狐步舞、利马、迈克、十一月、斑马

将这两组放在不同的列中,中间留一列。

  A       B          C
1 Set1    JoinColumn Set2
2 Alice              Bob
3 Bob                Charlie
4 Charlie            Foxtrot
5 Echo               Lima
6 Foxtrot            Mike
7 Lima               November
8                    Zebra

在单元格 B2 中输入此公式

==IF(COUNTIF($A$2:$A$8,C3)>0,C3,"<NULL>")

第一部分2澳元:8澳元是 Set1 中的单元格范围。$ 符号使它保持静态范围,因此您可以复制并粘贴到新单元格中,并且范围保持不变。C3是您正在加入的当前单元格右侧的单元格。

将其完全复制并粘贴下来,然后(显示演示公式)你将得到以下内容:

  A       B                                        C
1 Set1    JoinColumn                               Set2
2 Alice   =IF(COUNTIF($A$2:$A$8,C3)>0,C3,"<NULL>") Bob
3 Bob     =IF(COUNTIF($A$2:$A$8,C4)>0,C4,"<NULL>") Charlie
4 Charlie =IF(COUNTIF($A$2:$A$8,C5)>0,C5,"<NULL>") Foxtrot
5 Echo    =IF(COUNTIF($A$2:$A$8,C6)>0,C6,"<NULL>") Lima
6 Foxtrot =IF(COUNTIF($A$2:$A$8,C7)>0,C7,"<NULL>") Mike
7 Lima    =IF(COUNTIF($A$2:$A$8,C8)>0,C8,"<NULL>") November
8         =IF(COUNTIF($A$2:$A$8,C9)>0,C9,"<NULL>") Zebra

它实际上看起来像这样:

1 Set1    JoinColumn Set2
2 Alice   Bob        Bob
3 Bob     Charlie    Charlie
4 Charlie Foxtrot    Foxtrot
5 Echo    Lima       Lima
6 Foxtrot <NULL>     Mike
7 Lima    <NULL>     November
8         <NULL>     Zebra

还有几个步骤:

  • 复制 B 列并特殊粘贴粘贴价值观
  • 删除 A 列

现在你有一个简单的右外连接

  • 按 B 列排序
  • 删除值行

您有内部连接

我把处理多列表格的任务留给读者作为练习。

好的,我将向您介绍我认为最简单、最没有效率的方法:在两个方向上进行内连接,在连接字段上对每个集合进行排序,然后将结果并排放置。它们应该排成一行。(注意:这仅在连接列包含唯一值时才有效)

相关内容