Làm cách nào để tham gia hai tệp CSV?


22

Giả sử bạn có một tệp CSV có 2 trường: ID và email. Bạn có một tệp khác với 2 trường: email và tên. Làm thế nào bạn có thể tạo một tệp có cả ba trường được tham gia trên email?


5
Chi tiết hơn một chút về phép nối (nghĩa là bên trong, bên ngoài, bên trái). Danh sách email trên CSV thứ 1 có giống với danh sách thứ hai không? Hay một cái chứa nhiều hơn?
hyperslug

Ví dụ về các tệp csv sẽ có ích, cùng với HĐH bạn đang sử dụng?
Troggy

tôi nghĩ rằng danh sách 1 và 2 là giống hệt nhau. Tôi đang sử dụng Linux. Hãy giúp tôi!!! cảm ơn!! :)
crst53

1
dữ liệu lớn như thế nào?
Joshua

Câu trả lời:


24

Sửa đổi 3 :

Bạn phải sắp xếp cả hai danh sách trên email theo thứ tự abc, sau đó tham gia. Cho rằng trường email trường thứ 2 của tệp1 và trường thứ 1 của tệp2:

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

ý nghĩa tham số

-t ,: ',' là dấu phân cách trường
-k 2,2: sắp xếp ký tự trên trường thứ 2
-k 1,1: sắp xếp ký tự trên trường thứ 1
-1 2: tệp 1, trường thứ 2
-2 1: tệp 2, trường thứ 1
>: xuất ra tệp

sản xuất

email, ID, tên
email, ID, tên
...

sắp xếp theo email theo thứ tự abc.

Lưu ý rằng nếu bất kỳ email nào bị thiếu trong một trong hai tệp, nó sẽ bị bỏ qua khỏi kết quả.


2
CSV phức tạp hơn thế này. Ví dụ, dấu phân cách trường có thể được thoát.
pguardiario

@hyperslug tôi có thể tham gia đầy đủ bên ngoài không?
Abu Shoeb

Điều này sẽ không hoạt động nếu CSV được trích dẫn hỗn hợp / không được trích dẫn, nếu ID chứa dấu phẩy. Chỉ sử dụng giải pháp này để xử lý một lần khi bạn kiểm tra kết quả. Nhưng tôi khuyên bạn không nên sử dụng nó cho một kịch bản cấp sản xuất.
Ondra ižka

25

Sử dụng csvkit :

csvjoin -c email id_email.csv email_name.csv

hoặc là

csvjoin -c 2,1 id_email.csv email_name.csv

4
Tại sao đây không phải là câu trả lời hàng đầu?
alexg

công cụ tuyệt vời. Thậm chí nhận ra rằng một trong các tệp của tôi có dấu phân cách khác với ",".
D_K

6

Có lẽ nó quá mức cần thiết, nhưng bạn có thể nhập vào cơ sở dữ liệu (ví dụ: OpenOffice Base) dưới dạng hai loại bảng và xác định báo cáo là đầu ra mong muốn.

Nếu nhập CSV là một vấn đề, thì chương trình bảng tính (ví dụ OpenOffice Calc) có thể thực hiện nhập. Kết quả sau đó có thể dễ dàng được chuyển đến cơ sở dữ liệu.


4

Là một tài liệu tham khảo trong tương lai, bạn có thể muốn bắt đầu chơi xung quanh với AWK . Đó là một ngôn ngữ kịch bản nhỏ rất đơn giản tồn tại ở một số dạng trên mọi hệ thống * nix và nhiệm vụ duy nhất của nó là cuộc sống là thao tác với các cơ sở dữ liệu văn bản được phân tách tiêu chuẩn. Với một vài dòng script bỏ đi, bạn có thể làm một số điều rất hữu ích. Ngôn ngữ này nhỏ và thanh lịch và có tỷ lệ tiện ích / độ phức tạp tốt hơn bất kỳ thứ gì khác mà tôi biết.


Perl theo nhiều cách là một người kế thừa của awk.
Revierpost

awk không xử lý trích dẫn và thoát (ví dụ: xử lý, trong tệp CSV được phân tách) theo như tôi biết. Nếu bạn cần điều đó, sử dụng thư viện xử lý CSV chuyên dụng sẽ dễ dàng hơn; chúng tồn tại cho nhiều ngôn ngữ.
Revierpost

0

Sử dụng Đi: 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

Hãy thử CSV Cruncher .

Nó nhận các tệp CSV dưới dạng bảng SQL và sau đó cho phép truy vấn SQL, dẫn đến một tệp CSV hoặc JSON khác.

Đối với trường hợp của bạn, bạn sẽ chỉ gọi:

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

Công cụ cần Java 8 trở lên.

Một số ưu điểm:

  • Bạn thực sự nhận được hỗ trợ CSV, không chỉ là "giả sử dữ liệu là chính xác".
  • Bạn có thể tham gia trên nhiều phím.
  • Dễ sử dụng và hiểu hơn joincác giải pháp dựa trên.
  • Bạn có thể kết hợp nhiều hơn 2 tệp CSV.
  • Bạn có thể tham gia bằng các biểu thức SQL - các giá trị không nhất thiết phải giống nhau.

Tuyên bố từ chối trách nhiệm: Tôi đã viết công cụ đó. Nó đã từng bị xáo trộn sau khi Google Code bị đóng, nhưng tôi đã phục hồi nó và thêm các tính năng mới khi tôi sử dụng nó.


0

Bạn có thể đọc tệp CSV bằng chương trình bảng tính như LibreOffice và sử dụng VLOOKUP()macro để tìm kiếm tên trong tệp thứ hai.


7
Phần mở rộng tệp xlsx ngụ ý Microsoft Excel và tôi nghĩ rằng VLOOKUP cũng vậy. Câu hỏi này được gắn thẻ với Linux. Microsoft Excel có sẵn cho Linux không?
Peter Mortensen

Bây giờ LibreScript cũng có VLOOKUP .
Cristian Ciupitu

-1

Bạn cũng có thể sử dụng một công cụ được thiết kế đặc biệt để tham gia các tệp csv, chẳng hạn như công cụ được tìm thấy trên https://filerefowder.com

Các hoạt động chúng tôi hiện đang hỗ trợ là: Tham gia các tệp csv. Có thể thực hiện tương đương SQL của các hoạt động nối ngoài, trong, trái và phải trên hai tệp csv. Cột nào sẽ được sử dụng làm khóa tham gia trong mỗi tệp có thể định cấu hình được.


Vui lòng trích dẫn các phần thiết yếu của câu trả lời từ (các) liên kết tham chiếu, vì câu trả lời có thể trở nên không hợp lệ nếu (các) trang được liên kết thay đổi.
DavidPostill

Không còn tồn tại.
Ondra ižka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.