Como juntar dois arquivos CSV?

22

Suponha que você tenha um arquivo CSV com 2 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 por email?

crst53
fonte
5
Um pouco mais de detalhes sobre a junção (interna, externa, esquerda). A lista de e-mails no 1º CSV é idêntica à segunda lista? Ou um contém mais?
hyperslug
Exemplos de arquivos csv seriam úteis, juntamente com o sistema operacional que você está usando?
Troggy 20/08/09
Eu acho que a primeira e a segunda lista são idênticas. Eu estou usando Linux. Por favor ajude!!! obrigado!! :)
crst53 21/08/09
1
qual o tamanho dos dados?
21609 Joshua

Respostas:

24

Revisão3 :

Você deve classificar as duas listas por email em ordem alfabética e depois participar. Dado que o campo de email, o 2º campo do arquivo1 e o 1º 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,: ',' é o separador de campos
-k 2,2: ordenação de caracteres no 2º campo
-k 1,1: ordenação de caracteres no 1º campo
-1 2: arquivo 1, segundo campo
-2 1: arquivo 2, primeiro campo
>: saída para o arquivo

produz

email, ID, nome
email, ID, nome
...

classificados por email em ordem alfabética.

Observe que, se algum email estiver faltando em qualquer arquivo, ele será omitido nos resultados.

hyperslug
fonte
2
O CSV é mais complicado que isso. O separador de campos pode ser escapado, por exemplo.
Pguardiario
@hyperslug posso fazer junção externa completa?
Abu Shoeb
Isso não funcionará se o CSV estiver misturado entre aspas / não, se o ID contiver uma vírgula. Use esta solução apenas para processamento único, em que você verifica o resultado. Mas eu recomendo não usá-lo para um script em nível de produção.
Ondra Žižka
25

Use o csvkit :

csvjoin -c email id_email.csv email_name.csv

ou

csvjoin -c 2,1 id_email.csv email_name.csv
Tgr
fonte
4
Por que essa não é a resposta principal?
28915 alexg
ferramenta incrível. Mesmo reconhecido, que um dos meus arquivos tem um delimitador diferente de ",".
D_K
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 com a saída desejada.

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

Peter Mortensen
fonte
4

Como referência futura, você pode querer começar a brincar com o AWK . É uma pequena linguagem de script muito simples que existe de alguma forma em todos os sistemas * nix e sua única missão é a vida é a manipulação de bancos de dados textuais delimitados padrão. Com algumas linhas de script descartável, você pode fazer algumas coisas muito úteis. O idioma é pequeno e elegante e possui uma melhor relação utilidade / complexidade do que qualquer outra coisa que eu conheça.

Jim em Austin
fonte
Perl é, sob muitos aspectos, um sucessor do awk.
Reinierpost 14/09/10
O awk não lida com citações e escapes (por exemplo, lidar com s em um arquivo CSV separado) até onde eu sei. Se você precisar, é mais fácil usar uma biblioteca dedicada de manipulação de CSV; eles existem para muitos idiomas.
Reinierpost 14/09/10
0

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

}
chrislusf
fonte
0

Experimente o CSV Cruncher .

Ele usa arquivos CSV como tabelas SQL e, em seguida, permite consultas SQL, resultando em outro arquivo CSV ou JSON.

Para o seu caso, basta ligar para:

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

A ferramenta precisa do Java 8 ou posterior.

Algumas das vantagens:

  • Você realmente recebe suporte para CSV, e não apenas "vamos supor que os dados estejam corretos".
  • Você pode participar de várias chaves.
  • Mais fácil de usar e entender as joinsoluções do que as baseadas.
  • Você pode combinar mais de 2 arquivos CSV.
  • Você pode ingressar nas expressões SQL - os valores não precisam ser os mesmos.

Disclaimer: Eu escrevi essa ferramenta. Costumava estar desarrumado após o fechamento do Google Code, mas eu o revivei e adicionei novos recursos à medida que o uso.

Ondra Žižka
fonte
0

Você pode ler o arquivo CSV com um programa de planilha como o LibreOffice e usar VLOOKUP()macro para procurar o nome no segundo arquivo.

Janek
fonte
7
A extensão do arquivo xlsx implica o Microsoft Excel e acho que o VLOOKUP também. Esta questão está identificada com Linux. O Microsoft Excel está disponível para Linux?
Peter Mortensen
Agora, o LibreOffice também possui o VLOOKUP .
Cristian Ciupitu
-1

Você também pode usar uma ferramenta projetada especificamente para ingressar em arquivos csv, como a encontrada em https://filerefinery.com

As operações atualmente suportadas são: Juntando arquivos csv. É possível executar o equivalente em SQL das operações de junção externa, interna, esquerda e direita em dois arquivos csv. Qual coluna será usada como uma chave de junção em cada um dos arquivos é configurável.

liket
fonte
Cite as partes essenciais da resposta nos links de referência, pois a resposta pode se tornar inválida se as páginas vinculadas forem alteradas.
DavidPostill
Não existe mais.
Ondra Žižka