如何加入两个CSV文件?


22

假设您有一个包含2个字段的CSV文件:ID和电子邮件。您还有另一个文件,其中包含2个字段:电子邮件和名称。如何通过电子邮件将所有三个字段结合在一起生成文件?


5
有关联接的更多细节(即内部,外部,左侧)。第一个CSV上的电子邮件列表第二个CSV 列表相同吗?还是包含更多?
hyperslug

csv文件的示例以及您使用的OS都很方便吗?
Troggy

我认为第一和第二列表是相同的。我正在使用Linux。请帮忙!!!谢谢!!:)
crst53

1
数据有多大?
约书亚

Answers:


24

修订版3

您必须按字母顺序对电子邮件上的两个列表进行排序,然后再加入。给定email字段,file1的第二个字段和file2的第一个字段:

sort -t , -k 2,2 file1.csv > sort1.csv
sort -t , -k 1,1 file2.csv > sort2.csv
join -t , -1 2 -2 1 sort1.csv sort2.csv > sort3.csv

参数含义

-t,:','是字段分隔符
-k 2,2:第二个字段上的字符排序
-k 1,1:第一个字段上的字符排序
-1 2:文件1,第二字段
-2 1:文件2,第1个字段
>:输出到文件

产生

电子邮件,ID,名称
电子邮件,ID,名称
...

按电子邮件字母顺序排序。

请注意,如果两个文件中都缺少电子邮件,则结果中将忽略该电子邮件。


2
CSV比这更复杂。例如,可以对字段分隔符进行转义。
pguardiario

@hyperslug我可以进行完全外部联接吗?
阿布·肖布

如果CSV混合加引号/不加引号(如果ID包含逗号),则此功能将无效。仅在检查结果的一次性处理中使用此解决方案。但是我建议不要将其用于生产级脚本。
OndraŽižka18年

25

使用csvkit

csvjoin -c email id_email.csv email_name.csv

要么

csvjoin -c 2,1 id_email.csv email_name.csv

4
为什么这不是最佳答案?
alexg

很棒的工具。甚至认识到,我的文件之一与“,”定界符不同。
D_K

6

也许这是矫kill过正,但是您可以将两种表格导入数据库(例如OpenOffice Base)中,并定义作为所需输出的报告。

如果CSV导入有问题,则可以使用电子表格程序(例如OpenOffice Calc)进行导入。然后可以将结果轻松地传输到数据库。


4

作为将来的参考,您可能想开始尝试AWK。这是一种非常简单的小脚本语言,在每个* nix系统上都以某种形式存在,其唯一的任务就是生活是对标准定界文本数据库的操纵。使用几行一次性脚本,您可以做一些非常有用的事情。这种语言小巧而优雅,具有比我所知道的任何其他语言更好的实用性/复杂性比率。


Perl在许多方面都是awk的继承者。
reinierpost,2010年

据我所知,awk不会处理引号和转义符(例如,用。分隔的CSV文件处理)。如果需要,使用专用的CSV处理库会更容易;它们存在于多种语言中。
reinierpost 2010年

0

使用Go:https : //github.com/chrislusf/gleam

package main

import (
    "flag"
    "os"

    "github.com/chrislusf/gleam"
    "github.com/chrislusf/gleam/source/csv"
)

var (
    aFile = flag.String("a", "a.csv", "first csv file with 2 fields, the first one being the key")
    bFile = flag.String("b", "b.csv", "second csv file with 2 fields, the first one being the key")
)

func main() {

    flag.Parse()

    f := gleam.New()
    a := f.Input(csv.New(*aFile))
    b := f.Input(csv.New(*bFile))

    a.Join(b).Fprintf(os.Stdout, "%s,%s,%s\n").Run()

}

0

尝试CSV Cruncher

它将CSV文件作为SQL表,然后允许SQL查询,从而生成另一个CSV或JSON文件。

对于您的情况,您只需致电:

crunch -in tableA.csv tableB.csv -out output.csv \
   "SELECT tableA.id, tableA.email, tableB.name 
    FROM tableA LEFT JOIN tableB USING (email)"

该工具需要Java 8或更高版本。

一些优点:

  • 您确实获得了CSV支持,而不仅仅是“假设数据正确”。
  • 您可以加入多个键。
  • join基于解决方案的解决方案更易于使用和理解。
  • 您可以合并两个以上的CSV文件。
  • 您可以通过SQL表达式进行联接-值不必相同。

免责声明:我写了那个工具。在关闭Google Code后,它曾经处于混乱状态,但是我恢复了它并在使用时添加了新功能。


0

您可以使用电子表格程序(如LibreOffice)读取CSV文件,然后使用VLOOKUP()宏在第二个文件中搜索名称。


7
文件扩展名xlsx表示Microsoft Excel,我认为VLOOKUP也可以。这个问题被Linux标记。Microsoft Excel可用于Linux吗?
Peter Mortensen

现在,LibreOffice也具有VLOOKUP
Cristian Ciupitu 2014年

-1

您还可以使用专门设计用于连接csv文件的工具,例如https://filerefinery.com上的工具。

我们当前支持的操作是:连接csv文件。可以在两个csv文件上执行外部,内部,左和右联接操作的SQL等效项。在每个文件中哪个列将用作连接键是可配置的。


请在参考链接中引用答案的关键部分,因为如果链接页面发生更改,答案可能会失效。
DavidPostill

不复存在。
OndraŽižka18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.