2016-09-07 33 views
1

我花了相當長的時間搜索這個,但我似乎無法指出我正在尋找正確的方向。我的.csv文件的問題在於,儘管行結束符是',,,,',但有些行不包含此內容,因此,當我導入文件時,它很好,直到它到達其中一個文件,但它會處理它作爲一個記錄,大約是標準記錄應該有的列數的兩倍,然後從這一點開始將其拋棄。我需要做的是跳過超過正確列數的記錄(',,,,'終止之間的數據)(15)。我意識到每次發生這種情況時都會跳過2條記錄,但對於我正在處理的數據集非常大的情況,這很好。MySQL加載數據InFile;跳過行如果

我遇到了IGNORE關鍵字,但似乎並不適用。我正在尋找的東西是這樣的:對於導入期間的每條記錄,如果record.columns.count>跳過記錄15.這是我的導入語句,感謝您提供的任何幫助。

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或任何你喜歡的)寫一個腳本來以正確的格式重寫格式錯誤的記錄。


回覆您的評論:awk命令讀取您的原​​始文件並僅輸出每行有15個字段,其中字段用逗號分隔。

顯然你的輸入數據沒有正好有15個字段的行,即使你這樣描述它。


另一個想法:在原始的LOAD DATA命令中使用',,,,'行結束符有點奇怪。通常行結束符是'\ n',這是一個換行符。所以,當你將行結束符重新定義爲',,,,'時,這意味着MySQL將繼續讀取文本,直到找到',,,,',即使最終讀取多行文本中的數十個字段。也許你可以將你的行結束符設置爲',,,, \ n'。

+0

出於某種原因,csvData_fixed.csv文件已創建,但爲空。我對awk命令並不熟悉,但我只是開始研究它,看看我能否理解你在做什麼。你是在導入之前修改文件的解決方案,可以很好地工作,我只是不確定如何排除故障。謝謝 –

+0

感謝您的幫助,我通過僅使用'\ n'作爲行終止符並且不包括',,,,'來解決問題。太簡單了......你說得對,從來沒有NF == 15的條件,因爲有些字段包含這樣的字符串:「foo,bar」。即使它應該是一個字符串,中間的逗號也會被捕獲。再次感謝,我每天都會學到新的東西! –

+0

如果您使用了CSV解析函數,則可以處理帶引號的字符串中的嵌入逗號,並且在任何腳本語言中都應該有合適的函數。無論如何,我很高興使用換行符作爲行結束符的建議! –