这似乎是一个简单的概念,但我无法找到不编写代码就能做到这一点的方法。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 列排序
- 删除值行
您有内部连接
我把处理多列表格的任务留给读者作为练习。
好的,我将向您介绍我认为最简单、最没有效率的方法:在两个方向上进行内连接,在连接字段上对每个集合进行排序,然后将结果并排放置。它们应该排成一行。(注意:这仅在连接列包含唯一值时才有效)