저는 CSV 파일을 관계형 데이터베이스 테이블로 반복하는 방법을 찾고 있었습니다.
내 요구 사항과 정확히 일치하는 것을 찾지 못했기 때문에 몇 가지 조사를 했습니다. 부분적으로 좋은 옵션 몇 가지를 찾았습니다. 즉:
- 용어 SQL- stdin 또는 파일을 허용하고 그에 대한 일부 SQL 실행을 허용하지만 "테이블"만 설정합니다.
- csv2sqlite- 이는 termsql보다 sql의 잠재적으로 더 많은 이점을 허용하므로 매우 유망하지만 여전히 "테이블"은 하나만 있습니다.
- 이 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>