여러 CSV 파일을 SQL로 쿼리하는 좋은 방법은 무엇입니까?

여러 CSV 파일을 SQL로 쿼리하는 좋은 방법은 무엇입니까?

저는 CSV 파일을 관계형 데이터베이스 테이블로 반복하는 방법을 찾고 있었습니다.

내 요구 사항과 정확히 일치하는 것을 찾지 못했기 때문에 몇 가지 조사를 했습니다. 부분적으로 좋은 옵션 몇 가지를 찾았습니다. 즉:

  1. 용어 SQL- stdin 또는 파일을 허용하고 그에 대한 일부 SQL 실행을 허용하지만 "테이블"만 설정합니다.
  2. csv2sqlite- 이는 termsql보다 sql의 잠재적으로 더 많은 이점을 허용하므로 매우 유망하지만 여전히 "테이블"은 하나만 있습니다.
  3. 이 ULSE 문제- Unix 파일 탐색 명령을 사용하여 수집 작업을 구현하는 방법을 설명합니다. 이는 유망하고 가능한 시작점입니다.

일부 데이터베이스와 유사한 작업을 탐색하고 수행하는 것이 가능하며 매우 간단합니다.하나의csv/text 파일(열 합계, 평균, 최소, 최대, 하위 집합 등)이지만 두 파일이 아닌 경우 두 파일 사이에 어느 정도 연결이 있습니다. 쿼리를 위해 파일을 임시 데이터베이스로 가져오는 것도 가능합니다. 비록 제가 원하는 만큼 실용적이지는 않지만 그렇게 했습니다.

긴 이야기 짧게- 기본적으로 csv 파일에 빠르고 복잡한 SQL 조인을 수행하는 편리한 방법을 원합니다. 완전한 텍스트 기반 RDBMS를 찾는 것이 아니라 csv RDBMS 추출에 대한 분석을 수행하는 더 좋은 방법입니다.

예:

sqlthingy -i tbl1.csv tbl2.csv -o 'select 1,2,3 from tbl1, tbl2 where tbl1.1 = tbl2.1'

이것은 시간을 들여 해결해도 될 만큼 흥미로운 문제인 것 같지만, 이미 존재하는지 알고 싶습니다.

답변1

보세요데이터베이스 테이블(펄) 또는csvkit(파이썬). 모두 다양한 문제와 제한 사항이 있지만 일반적으로 "작은" 데이터에 적합합니다. 물론, 충분하지 않은 경우 언제든지 적절한 데이터베이스로 대체할 수 있습니다.

답변2

당신이 원하는 것은 join명령입니다.이것은POSIX에 의해 지정됨.

다음은 의사코드 명령 예시입니다.

sqlthingy -i tbl1.csv tbl2.csv -o 'select 1,2,3 from tbl1, tbl2 where tbl1.1 = tbl2.1'

이것은 실제 작업 명령입니다 join. 이에 상응하는 명령을 사용하십시오.

join -t, tbl1.csv tbl2.csv

두 파일에 필드가 두 개(쉼표로 구분됨)만 있는 경우 이 join명령은 의사 코드로 표현한 것과 정확히 같습니다.

더 많은 필드가 있지만 각 파일의 두 번째 필드만 원하고 여전히 첫 번째 필드를 결합하려는 경우 다음을 사용할 수 있습니다.

join -t, -o 0,1.2,2.2 tbl1.csv tbl2.csv

다른 필드에 참여하려는 경우 해당 플래그가 있습니다.

본격적인 RDBMS는 아닙니다. 예를 들어 두 개의 파일과 하나의 조인 필드만 사용할 수 있습니다. 하지만 당신이 요청한 것에 대해서는:

TL;DR - 저는 기본적으로 csv 파일에 빠르고 더러운 SQL 조인을 수행하는 편리한 방법을 원합니다. 완전한 텍스트 기반 RDBMS를 찾는 것이 아니라 csv RDBMS 추출에 대한 분석을 수행하는 더 좋은 방법입니다.

그것은 요구 사항을 충족합니다완벽한.


당신은 또한 확인해야합니다 comm,POSIX에서도 지정됨, 두 파일에 공통된 줄을 인쇄하기 위한 것입니다(또는 한쪽에만 존재하거나 이와 유사한 것).

또한 및 둘 다 join파일 이름으로 사용되어 comm표준 입력에서 작동 할 수 있습니다.-


"group by" 절이 포함된 SQL "count()" 명령과 동등한 기능을 원하는 경우 필요한 열을 가져오면 됩니다( join조인 필드를 사용하여 정렬되거나 파일에서 직접 정렬할 수 있는 경우 직접 정렬할 수 있음). 파이프라인을 통해 전달합니다 uniq -c.


~ 사이,가입하다,고유한,의사소통, 그리고유형, CSV를 사용하면 매우 멋진 작업을 수행할 수 있습니다. 이들 모두는 POSIX와 호환됩니다.

답변3

아파치 장비CSV 및 JSON 파일을 직접 쿼리하고 연결할 수 있습니다.

처음에 파일 위치를 정의하고 파일 확장자에 따라 설정을 조정하면 됩니다(예: 첫 번째 줄을 헤더로 사용할지 여부).

그러면 클라이언트를 사용하는 것과 같지만 mysql테이블은 디스크의 실제 파일입니다.

$ ./bin/drill-embedded 
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0
Nov 07, 2017 7:05:52 PM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.8 2014-04-29 01:25:26...
apache drill 1.11.0 
"drill baby drill"
0: jdbc:drill:zk=local> SELECT ix.field1, o.field2, o.field3 
. . . . . . . . . . . > FROM dfs.myfolder.`file1.tsv` ix
. . . . . . . . . . . > LEFT JOIN dfs.myfolder.`file2.tsv` o ON (o.field=ix.field)
. . . . . . . . . . . > LIMIT 10;
+-------------+-------------+---------------+
| field1      | field2      | field3        |
+-------------+-------------+---------------+
...redacted...
+-------------+-------------+---------------+
10 rows selected (0.656 seconds)
0: jdbc:drill:zk=local> 

관련 정보