2016-09-07 6 views
1

나는 이것을 검색하는 데 상당한 시간을 보냈지 만, 내가 찾고있는 것의 정확한 방향으로 자신을 지적 할 수는없는 것 같습니다. 내 .csv 파일의 문제는 줄 종결자는 ',,,,'이지만 일부 줄에는이 줄이 포함되어 있지 않으므로 파일을 가져올 때까지이 줄 중 하나에 도달 할 때까지는 괜찮지 만 이후에는 처리합니다. 표준 레코드가 가져야하는 열의 양의 약 두 배인 하나의 레코드로, 그 다음부터는 그 레코드가 앞으로 던져집니다. 내가해야 할 일은 정확한 열 수 (15)보다 많은 레코드 (',,,,'종단 사이의 데이터)를 건너 뛰는 것입니다. 이 일이 발생할 때마다 기본적으로 2 개의 레코드를 건너 뛸 것이라고 생각합니다. 그러나 꽤 큰 데이터 세트로 수행하고있는 작업의 목적에 맞습니다.MySQL로드 데이터 InFile; 행을 건너 뜁니다. IF

나는 IGNORE 키워드를 발견했으나 적용되지 않는 것으로 보입니다. 내가 찾고있는 것은 다음과 같다. import 중 각 레코드에 대해 record.columns.count> 15 인 경우 레코드를 건너 뜁니다. 여기에 내 import 문이 있습니다. 제공되는 도움에 감사드립니다.

LOAD DATA LOCAL INFILE "/Users/foo/Desktop/csvData.csv" 
INTO TABLE csvData 
COLUMNS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
ESCAPED BY '"' 
LINES TERMINATED BY ',,,,'; 
+0

@Bill Karwin이 태그를 추가해 주셔서 감사합니다. –

답변

0

당신은 단지 잘못된 기록을 생략 할 경우, 간단한 awk 명령은 좋은 레코드를 필터링 할 수있다 : 고정 된 파일에서 다음

awk -F, '{ if (NF == 15) print; }' csvData.csv > csvData_fixed.csv 

LOAD DATA.

좋아하는 사람은 awk (또는 Python 또는 원하는대로)를 사용하여 잘못된 형식의 레코드를 올바른 형식으로 다시 쓸 수 있습니다.


Re : 귀하의 의견 : awk 명령은 원본 파일을 읽고 정확한 15 개의 필드가있는 각 행을 출력하며 필드는 쉼표로 구분됩니다.

입력 된 데이터에는 정확히 15 개의 필드가있는 것으로 나타났습니다.


또 다른 생각 : 원래의 LOAD DATA 명령에서 ',,,'의 줄 종결자를 사용하는 것이 약간 이상합니다. 일반적으로 줄 종결자가 '\ n'이며 줄 바꿈 문자입니다. 따라서 줄 종결자를 ',,,,'으로 다시 정의하면 MySQL은 여러 줄의 텍스트에서 수십 개의 필드를 읽는 경우에도 ',,,,'을 찾을 때까지 텍스트를 계속 읽습니다. 아마도 라인 종결자를 ',,,, \ n'으로 설정할 수 있습니다.

+0

어떤 이유로 csvData_fixed.csv 파일이 생성되었지만 비어 있습니다. 나는 awk 명령에 익숙하지 않지만, 나는 당신이하는 일을 이해할 수 있는지보기 위해 방금 살펴보기 시작했다. 가져 오기 전에 파일을 수정하는 솔루션을 사용하면 문제가 없습니다. 여기에서 문제를 해결하는 방법을 모르겠습니다. 감사합니다 –

+0

당신의 도움을 주셔서 감사합니다, 나는 그것을 사용하여 '\ n'줄 종결 자로 ',,,,'포함하지 않고. 너무 간단 ... 그리고 당신 말이 맞았습니다. NF == 15의 조건은 결코 없었습니다. 왜냐하면 필드 중 일부에는 "foo, bar"와 같은 문자열이 포함 되었기 때문입니다. 중간에있는 쉼표는 비록 하나의 문자열이어야하지만 캡처되었습니다. 다시 한 번 감사드립니다. 매일 새로운 것을 배웁니다! –

+0

인용 문자열에 삽입 된 쉼표는 CSV 구문 분석 함수를 사용하고 스크립팅 언어에 적합한 함수가 있어야 처리 할 수있었습니다. 어쨌든 라인 종결 자로 줄 바꿈을 사용하는 것이 좋습니다! –