티스토리 뷰
나는 @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 : LOAD
tmp 테이블에 저장 한 다음 INSERT SELECT
원하는 테이블을 실제 테이블에 복사합니다.
플랜 B : LOAD
불필요한 열 @variables
(아무것도하지 않을 것).
출처
https://stackoverflow.com/questions/39929980