Jak połączyć dwa pliki CSV?

22

Załóżmy, że masz jeden plik CSV z 2 polami: identyfikator i adres e-mail. Masz inny plik z 2 polami: adres e-mail i nazwa. Jak możesz utworzyć plik ze wszystkimi trzema polami połączonymi w wiadomości e-mail?

crst53
źródło
5
Trochę więcej szczegółów na złączeniu (tj. Wewnętrzny, zewnętrzny, lewy). Czy lista e-mail na 1. CSV jest identyczna z drugą listą? Czy może zawiera więcej?
hyperslug
Przydałyby się przykłady plików csv wraz z używanym systemem operacyjnym?
Troggy,
Myślę, że 1. i 2. lista są identyczne. Używam Linuksa. Proszę pomóż!!! dzięki!! :)
crst53
1
jak duże są dane?
Joshua

Odpowiedzi:

24

Wersja 3 :

Musisz posortować obie listy alfabetycznie, a następnie dołączyć. Biorąc pod uwagę, że pole e-mail to drugie pole pliku 1 i pierwsze pole pliku 2:

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

znaczenie parametru

-t,: „,” jest separatorem pól
-k 2,2: sortowanie znaków na 2. polu
-k 1,1: sortowanie znaków na 1. polu
-1 2: plik 1, drugie pole
-2 1: plik 2, 1. pole
>: wyjście do pliku

produkuje

adres e-mail, identyfikator, imię i nazwisko
adres e-mail, identyfikator, imię i nazwisko
...

posortowane alfabetycznie według wiadomości e-mail.

Pamiętaj, że jeśli w którymkolwiek pliku brakuje e-maila, zostanie on pominięty w wynikach.

hiperslug
źródło
2
CSV jest bardziej skomplikowany. Separator pól można na przykład uciec.
pguardiario
@yperslug czy mogę wykonać pełne łączenie zewnętrzne?
Abu Shoeb,
To nie zadziała, jeśli CSV jest mieszany w cudzysłowie / nie jest cytowany, jeśli identyfikator zawiera przecinek. Użyj tego rozwiązania tylko do jednorazowego przetwarzania, w którym sprawdzasz wynik. Ale zalecam nie używać go do skryptu na poziomie produkcyjnym.
Ondra Žižka
24

Użyj csvkit :

csvjoin -c email id_email.csv email_name.csv

lub

csvjoin -c 2,1 id_email.csv email_name.csv
Tgr
źródło
4
Dlaczego nie jest to najlepsza odpowiedź?
alexg
niesamowite narzędzie. Nawet uznałem, że jeden z moich plików ma separator inny niż „”.
D_K
6

Być może jest to przesada, ale możesz zaimportować do bazy danych (np. OpenOffice Base) jako dwa rodzaje tabel i zdefiniować raport, który jest pożądanym wynikiem.

Jeśli import CSV stanowi problem, program do obsługi arkuszy kalkulacyjnych (np. OpenOffice Calc) może wykonać import. Wynik można następnie łatwo przenieść do bazy danych.

Peter Mortensen
źródło
4

W przyszłości możesz zacząć bawić się AWK . Jest to bardzo prosty, mały język skryptowy, który istnieje w jakiejś formie na każdym systemie * nix, a jego jedyną misją jest życie w manipulowaniu standardowymi bazami danych tekstowych. Za pomocą kilku wierszy skryptu możesz zrobić kilka bardzo przydatnych rzeczy. Język jest mały i elegancki i ma lepszy współczynnik użyteczności / złożoności niż wszystko inne, o czym jestem świadomy.

Jim w Austin
źródło
Perl jest pod wieloma względami następcą awk.
reinierpost
awk nie obsługuje cytowania i zmiany znaczenia (o ile wiem, radzenia sobie z plikiem s w oddzielnym pliku CSV). W razie potrzeby korzystanie z dedykowanej biblioteki obsługi CSV jest łatwiejsze; istnieją dla wielu języków.
reinierpost
0

Użyj 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
źródło
0

Wypróbuj CSV Cruncher .

Pobiera pliki CSV jako tabele SQL, a następnie zezwala na zapytania SQL, co powoduje powstanie innego pliku CSV lub JSON.

W twoim przypadku wystarczy zadzwonić:

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

Narzędzie wymaga Java 8 lub nowszej.

Niektóre zalety:

  • Naprawdę otrzymujesz wsparcie CSV, a nie tylko „załóżmy, że dane są poprawne”.
  • Możesz dołączyć do wielu kluczy.
  • Łatwiejsze w użyciu i zrozumieniu niż joinoparte na rozwiązaniach.
  • Możesz łączyć więcej niż 2 pliki CSV.
  • Możesz dołączyć wyrażenia SQL - wartości nie muszą być takie same.

Oświadczenie: Napisałem to narzędzie. Kiedyś był nieuporządkowany po zamknięciu Google Code, ale ożywiłem go i dodałem nowe funkcje podczas jego używania.

Ondra Žižka
źródło
0

Możesz odczytać plik CSV za pomocą programu do obsługi arkuszy kalkulacyjnych, takiego jak LibreOffice, i użyć VLOOKUP()makra, aby wyszukać nazwę w drugim pliku.

Janek
źródło
7
Rozszerzenie pliku xlsx oznacza Microsoft Excel i myślę, że VLOOKUP również. To pytanie jest oznaczone tagiem Linux. Czy program Microsoft Excel jest dostępny dla systemu Linux?
Peter Mortensen,
Teraz LibreOffice ma również WYSZUKAJ.PIONOWO .
Cristian Ciupitu
-1

Możesz także użyć narzędzia zaprojektowanego specjalnie do łączenia plików csv, takiego jak to znalezione na https://filerefinery.com

Operacje, które obecnie obsługujemy to: Dołączanie plików csv. Możliwe jest wykonanie SQL odpowiednika operacji łączenia zewnętrznego, wewnętrznego, lewego i prawego na dwóch plikach csv. Która kolumna zostanie użyta jako klucz łączenia w każdym z plików, można konfigurować.

lubić
źródło
Podaj zasadnicze części odpowiedzi z linku (linków) referencyjnych, ponieważ odpowiedź może stać się nieważna w przypadku zmiany połączonych stron.
DavidPostill
Już nie istnieje.
Ondra Žižka