Como juntar dois arquivos CSV?

18

Suponha que você tenha um arquivo CSV com dois campos: ID e email. Você tem outro arquivo com 2 campos: email e nome. Como você pode produzir um arquivo com todos os três campos unidos no email?

    
por crst53 21.08.2009 / 01:22

8 respostas

24

Revisão 3 :

Você deve ordenar as duas listas no email em ordem alfabética e, em seguida, participar. Dado que o campo de e-mail o segundo campo do arquivo1 e o primeiro campo do arquivo2:

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

significado do parâmetro

-t ,   : ',' is the field separator
-k 2,2 : character sort on 2nd field
-k 1,1 : character sort on 1st field
-1 2   : file 1, 2nd field
-2 1   : file 2, 1st field
>      : output to file

produz

email,ID,name
email,ID,name
...

classificado por email por ordem alfabética.

Observe que, se algum e-mail estiver faltando em um dos arquivos, ele será omitido dos resultados.

    
por 21.08.2009 / 02:11
16

Use o csvkit :

csvjoin -c email id_email.csv email_name.csv

ou

csvjoin -c 2,1 id_email.csv email_name.csv
    
por 12.12.2014 / 01:29
6

Talvez seja um exagero, mas você pode importar para um banco de dados (por exemplo, OpenOffice Base) como dois tipos de tabelas e definir um relatório que é o resultado desejado.

Se a importação de CSV for um problema, um programa de planilha (por exemplo, o OpenOffice Calc) pode fazer a importação. O resultado pode então facilmente ser transferido para o banco de dados.

    
por 21.08.2009 / 01:36
4

Como referência futura, convém começar a brincar com o AWK . É uma pequena e muito simples linguagem de script que existe de alguma forma em cada sistema * nix e sua única missão é a manipulação de bancos de dados textuais padrão delimitados. Com algumas linhas de script descartáveis, você pode fazer algumas coisas muito úteis. A linguagem é pequena e elegante e tem uma melhor relação utilidade / complexidade do que qualquer outra coisa que eu saiba.

    
por 21.08.2009 / 17:02
0

A resolução mais fácil do problema - crie o xlsx a partir do csv e use o Vlookup para procurar o nome no segundo arquivo:)

    
por 06.12.2010 / 13:45
0

Use o Google Go: link

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()

}
    
por 22.10.2016 / 00:42
0

Você também pode usar uma ferramenta especificamente criada para unir arquivos csv, como o encontrado no link

The operations we currently support are: Joining csv files. It is possible to perform the SQL equivalent of outer, inner, left and right join operations on two csv files. Which column will be used as a join key in each of the files is configurable.

    
por 20.11.2017 / 21:04
0

Sugiro o CSV Cruncher , que usa arquivos CSV como tabelas SQL e, em seguida, permite consultas SQL, resultando em outro arquivo CSV .

Exemplo:

crunch input.csv output.csv \
   "SELECT AVG(duration) AS durAvg FROM (SELECT * FROM indata ORDER BY duration LIMIT 2 OFFSET 6)"

A ferramenta precisa do Java 5 ou posterior.

Algumas das vantagens:

  • Você realmente recebe suporte para CSV, não apenas "suponhamos que os dados estejam corretos".
  • Você pode participar de várias chaves.
  • Mais fácil de usar e entender do que as soluções join .
  • Você pode combinar mais de dois arquivos CSV.
  • Você pode unir por expressões SQL - os valores não precisam ser os mesmos.

Aviso: Eu escrevi essa ferramenta. Estado de projeto desconhecido - o Google Code foi fechado e não foi transferido em breve. Eu posso dar uma olhada se alguém for investigado.

    
por 02.05.2018 / 05:54

Tags