티스토리 뷰

나는 @GhostCat에 확실히 동의합니다. CSV를 파싱하는 것은 쉼표로 나누는 것보다 훨씬 더 복잡하지만 일부 사소한 CSV가 작동 할 수도 있습니다. 그러나 종종 CSV는 필드 내에 쉼표를 포함 할 수 있으므로 쉼표로 분할하면 문제가 발생합니다.

즉, 스크립트가 원하는 작업을 수행하지 않는 이유에 대한 문제는 파일의 내용에서 단어 분할이 발생하도록하고 awk각 "단어"를 시도하는 것 입니다. 내부 카운터를 증가 awk시키고 파일 읽기를 처리하도록해야합니다. 원래 awk명령에 만족한다고 가정하면 다음과 같이 할 수 있습니다.

 awk -F',' 'BEGIN {id=1} {print "INSERT INTO athletes (id, username, gender, sport_abbreviation) VALUES ( " id " \47"$1"\47, \47"$3"\47, \47"$5"\47);";id+=2}' users72.csv

지역 id변수를 만들고 각 줄에 대해 2 씩 증가시킵니다. 나는 또한 당신이했던 것처럼 많은 따옴표와 이스케이프를 사용하는 대신 8 진수 이스케이프를 사용하여 각 필드 주위에 작은 따옴표를 인쇄했습니다. 원하는 경우 원하는 방식으로 돌아갈 수 있습니다 (또는 \42원하는 경우 큰 따옴표를 사용). 마지막으로 awk파일 자체를 열어서 cat및 파이프 라인을 피할 수 있도록 변경했습니다 .

-------------------

다음과 같이 말하는 것이 훨씬 더 간단 할 것입니다.

LOAD DATA INFILE 'users72.csv'
    INTO TABLE athletes
        FIELDS TERMINATED BY ','
            ...
                (id, username, gender, sport_abbreviation)
                    ;
                    

awk는 필요 없습니다. 훨씬 더 빨리; 기타

참고

부록

모든 열이 필요하지 않은 경우 ...

계획 A : LOADtmp 테이블에 저장 한 다음 INSERT SELECT원하는 테이블을 실제 테이블에 복사합니다.

플랜 B : LOAD불필요한 열 @variables(아무것도하지 않을 것).



출처
https://stackoverflow.com/questions/39929980
댓글
공지사항
Total
Today
Yesterday
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31