대용량 csv 파일을 분할해야 함

대용량 csv 파일을 분할해야 함

csv 파일이 있는데 더 작은 파일로 나누어야 합니다. Split -l 20000 test.csv 문제 없습니다. 내 문제는 파일에 다른 헤더가 포함되어 있다는 것입니다. 예를 들어 +-1000줄마다 분할하고 싶지만 급여 헤더 다음에 분할해야 하며 새 파일은 cust 헤더로 시작해야 합니다.

고객 헤더,xxx,xxxxxx,xxxxxx
txn 헤더,xxxx,xxx,,xxxx,xxxxx,,xxx
상세 제목,xxxx,xxxx,xxxxxx,xxxx,xxxx
상세 제목,xxxxxxxx,xxxxxxxxxx,xxx,,
지급명,,,,,xxxx,xxxxx
고객 헤더,xxx,xxxxxx,xxxxxx
txn 헤더,xxxx,xxx,,xxxx,xxxxx,,xxx
상세 제목,xxxx,xxxx,xxxxxx,xxxx,xxxx
지급명,,,,,xxxx,xxxxx
고객 헤더,xxx,xxxxxx,xxxxxx
txn 헤더,xxxx,xxx,,xxxx,xxxxx,,xxx
상세 제목,xxxx,xxxx,xxxxxx,xxxx,xxxx
지급명,,,,,xxxx,xxxxx

답변1

당신은 이것을 할 수 있습니다 awk:

awk -vfilename=output -vcut=1000  '
    BEGIN { nl=0; nf=1; f=filename "." nf;} 
    ++nl >= cut && /^cust header,/ {
         close(f); nl=0; f=filename "." ++nf}
   {print > f}' < file

개수가 (여기서는 1000)보다 크고 cut현재 줄이 로 끝나면 보이는 줄 수를 기록합니다 cust header,. 출력 파일 이름은 output.1, output.2, ... ( filename변수) 입니다.

답변2

ilkkachu의 솔루션은 깔끔하고 단일 실행 파일을 사용하며 아마도 정답일 것입니다. 하지만, awk일까츄가 먼저 대답하지 않았다면, 내가 선택했을지도 모른다 csplit. csplit다음을 기준으로 텍스트 파일을 분할합니다.컨텍스트 라인(글쎄, 정규 표현식). 그런 다음 이미 알고 있는 유틸리티를 사용하여 해당 출력을 가져와 split파일을 추가로 분할할 수 있습니다.

$ csplit --prefix="MySplit." test.csv '/^cust header,/' '{*}'
0
174
134
134

이는 블록당 바이트 수입니다(이 예에서는 무시함). 이제 각 청크를 반복 MySplit하고 20k 요구 사항으로 더 분할합니다.

$ for i in MySplit.0*; do
    split --additional-suffix=".$i" -l 20000 "$i"
  done

예를 들어 -l 220k 대신 사용하면 특정 샘플의 최종 출력은 다음과 같습니다(확장자별로 정렬).

$ ls -lhXB
total 44K
-rw-r--r-- 1 hunteke hunteke   0 Jun 15 13:31 MySplit.00
-rw-r--r-- 1 hunteke hunteke 174 Jun 15 13:31 MySplit.01
-rw-r--r-- 1 hunteke hunteke  67 Jun 15 13:27 xaa.MySplit.01
-rw-r--r-- 1 hunteke hunteke  81 Jun 15 13:27 xab.MySplit.01
-rw-r--r-- 1 hunteke hunteke  26 Jun 15 13:27 xac.MySplit.01
-rw-r--r-- 1 hunteke hunteke 134 Jun 15 13:31 MySplit.02
-rw-r--r-- 1 hunteke hunteke  67 Jun 15 13:27 xaa.MySplit.02
-rw-r--r-- 1 hunteke hunteke  67 Jun 15 13:27 xab.MySplit.02
-rw-r--r-- 1 hunteke hunteke 134 Jun 15 13:31 MySplit.03
-rw-r--r-- 1 hunteke hunteke  67 Jun 15 13:27 xaa.MySplit.03
-rw-r--r-- 1 hunteke hunteke  67 Jun 15 13:27 xab.MySplit.03
-rw-r--r-- 2 hunteke hunteke 442 Jun 15 13:06 test.csv

관련 정보