두 개의 CSV 파일을 결합하는 방법은 무엇입니까?


22

ID와 이메일이라는 두 개의 필드가있는 하나의 CSV 파일이 있다고 가정하십시오. 이메일과 이름이라는 두 개의 필드가있는 다른 파일이 있습니다. 세 개의 필드가 모두 이메일로 결합 된 파일을 어떻게 생성 할 수 있습니까?


5
조인에 대해 좀 더 자세히 설명합니다 (즉, 내부, 외부, 왼쪽). 첫 번째 CSV의 이메일 목록 이 두 번째 목록 과 동일 합니까? 아니면 하나 더 포함되어 있습니까?
hyperslug

csv 파일의 예는 사용중인 OS와 함께 사용하기 편리합니까?
Troggy

나는 첫 번째와 두 번째 목록이 동일하다고 생각합니다. Linux를 사용하고 있습니다. 도와주세요!!! 감사!! :)
crst53

1
데이터가 얼마나 큽니까?
Joshua

답변:


24

개정 3 :

이메일에서 두 목록을 알파벳순으로 정렬 한 다음 가입해야합니다. 이메일 필드 file1의 두 번째 필드와 file2의 첫 번째 필드를 가정하십시오.

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

매개 변수 의미

-t, : ','는 필드 구분자입니다.
-k 2,2 : 두 번째 필드의 문자 정렬
-k 1,1 : 첫 번째 필드의 문자 정렬
-1 2 : 파일 1, 2 번째 필드
-2 1 : 파일 2, 첫 번째 필드
> : 파일로 출력

생산

이메일, ID, 이름
이메일, ID, 이름
...

알파벳순으로 이메일을 기준으로 정렬합니다.

두 파일 중 하나에서 누락 된 이메일이 있으면 결과에서 생략됩니다.


2
CSV는 이보다 더 복잡합니다. 예를 들어 필드 구분 기호를 이스케이프 처리 할 수 ​​있습니다.
pguardiario

@hyperslug 전체 외부 가입을 할 수 있습니까?
Abu Shoeb

ID에 쉼표가 포함되어 있으면 CSV가 따옴표로 묶여 있거나 인용되지 않은 경우 작동하지 않습니다. 결과를 확인하는 일회성 처리에만이 솔루션을 사용하십시오. 그러나 프로덕션 레벨 스크립트에는 사용하지 않는 것이 좋습니다.
Ondra Žižka

25

csvkit 사용 :

csvjoin -c email id_email.csv email_name.csv

또는

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

4
이것이 왜 정답이 아닌가?
alexg

멋진 도구. 심지어 내 파일 중 하나가 ","구분 기호와 다릅니다.
D_K

6

아마도 과도하지만, 두 가지 종류의 테이블로 데이터베이스 (예 : OpenOffice Base)로 가져 와서 원하는 출력 인 보고서를 정의 할 수 있습니다.

CSV 가져 오기에 문제가있는 경우 스프레드 시트 프로그램 (예 : OpenOffice Calc)이 가져 오기를 수행 할 수 있습니다. 그러면 결과를 데이터베이스로 쉽게 전송할 수 있습니다.


4

향후 참고 자료로 AWK를 가지고 놀기를 원할 수도 있습니다 . 모든 * nix 시스템에 어떤 형태로 존재하는 매우 간단한 작은 스크립팅 언어이며, 유일한 임무는 삶이 표준으로 구분 된 텍스트 데이터베이스를 조작하는 것입니다. 몇 줄의 스크립트를 사용하면 매우 유용한 작업을 수행 할 수 있습니다. 언어는 작고 우아하며 내가 아는 것보다 유틸리티 / 복잡성 비율이 더 좋습니다.


펄은 여러면에서 awk의 후계자입니다.
reinierpost

awk는 내가 아는 한 인용 및 이스케이프 처리 (예 : 분리 된 CSV 파일의 s 처리)를 처리하지 않습니다. 필요한 경우 전용 CSV 처리 라이브러리를 사용하는 것이 더 쉽습니다. 그들은 많은 언어에 존재합니다.
reinierpost

0

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

CSV Cruncher를 사용해보십시오 .

CSV 파일을 SQL 테이블로 사용하고 SQL 쿼리를 허용하여 다른 CSV 또는 JSON 파일을 생성합니다.

귀하의 경우 다음과 같이 전화하십시오.

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

이 도구에는 Java 8 이상이 필요합니다.

장점 중 일부 :

  • "데이터가 정확하다고 가정"하는 것이 아니라 실제로 CSV 지원을받을 수 있습니다.
  • 여러 키를 결합 할 수 있습니다.
  • join기반 솔루션 보다 사용하기 쉽고 이해하기 쉽습니다 .
  • 2 개 이상의 CSV 파일을 결합 할 수 있습니다.
  • SQL 표현식으로 조인 할 수 있습니다. 값이 같을 필요는 없습니다.

면책 조항 : 나는 그 도구를 썼습니다. Google 코드가 닫힌 후에는 혼란 스러웠지만 사용하면서 새로운 기능을 추가하고 소생 시켰습니다.


0

LibreOffice와 같은 스프레드 시트 프로그램으로 CSV 파일을 읽고 VLOOKUP()매크로를 사용 하여 두 번째 파일에서 이름을 검색 할 수 있습니다.


7
파일 확장자 xlsx는 Microsoft Excel을 의미하며 VLOOKUP도 마찬가지입니다. 이 질문은 Linux로 태그되었습니다. Linux에서 Microsoft Excel을 사용할 수 있습니까?
피터 Mortensen

이제 LibreOffice에는 VLOOKUP 도 있습니다.
Cristian Ciupitu

-1

https://filerefinery.com 에있는 것과 같은 CSV 파일을 결합하기 위해 특별히 설계된 도구를 사용할 수도 있습니다.

현재 지원되는 작업은 다음과 같습니다. csv 파일 결합. 두 csv 파일에 대해 외부, 내부, 왼쪽 및 오른쪽 조인 작업에 해당하는 SQL을 수행 할 수 있습니다. 각 파일에서 조인 키로 사용될 열을 구성 할 수 있습니다.


링크 된 페이지가 변경되면 답변이 유효하지 않을 수 있으므로 참조 링크에서 답변의 필수 부분을 인용하십시오.
DavidPostill

더 이상 존재하지 않다.
Ondra Žižka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.