Answers:
修订版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,名称 ...
按电子邮件字母顺序排序。
请注意,如果两个文件中都缺少电子邮件,则结果中将忽略该电子邮件。
作为将来的参考,您可能想开始尝试AWK。这是一种非常简单的小脚本语言,在每个* nix系统上都以某种形式存在,其唯一的任务就是生活是对标准定界文本数据库的操纵。使用几行一次性脚本,您可以做一些非常有用的事情。这种语言小巧而优雅,具有比我所知道的任何其他语言更好的实用性/复杂性比率。
使用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()
}
尝试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或更高版本。
一些优点:
join
基于解决方案的解决方案更易于使用和理解。免责声明:我写了那个工具。在关闭Google Code后,它曾经处于混乱状态,但是我恢复了它并在使用时添加了新功能。
您可以使用电子表格程序(如LibreOffice)读取CSV文件,然后使用VLOOKUP()
宏在第二个文件中搜索名称。
您还可以使用专门设计用于连接csv文件的工具,例如https://filerefinery.com上的工具。
我们当前支持的操作是:连接csv文件。可以在两个csv文件上执行外部,内部,左和右联接操作的SQL等效项。在每个文件中哪个列将用作连接键是可配置的。