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?


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.


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

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.


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.


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

}

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.


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.


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ć.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.