2014-01-23 60 views
0

我無法識別CSV的行如何終止。我正在使用以下PHP代碼將數據從CSV加載到我的數據庫中。當從PHP導入上傳的CSV到MySQL表時導致正確的LINES TERMINATED BY

mysql_query('LOAD DATA LOCAL INFILE "temp/test.csv" 
      INTO TABLE test 
      FIELDS TERMINATED BY "," 
      LINES TERMINATED BY "///" 
      IGNORE 1 LINES (one, two, three, four, five)'); 

現在,當我使用LINES TERMINATED BY "///",該數據被放入我的數據庫正確,除了一個事實,即在每一行的第一列是「迴歸」,隨後的單元格數據。這不是我想要的,我希望回報消失。

我認爲,最後一列單元格,///,返回和第一列單元格的CSV的序列由///分裂,應由/// +收益進行拆分。我應該改變LINES TERMINATED BY。我試過\n\r\r\n,\n\r。過了一段時間,我嘗試了<br>,並知道我需要幫助。

我在Mac上使用MS Office並將我的CSV保存爲Comma Separated Values (.csv)sample)。我也嘗試了LINES TERMINATED BYMS-DOS Comma SeparatedWindows Comma Separated文件。

SELECT HEX(one) FROM test結果運行我的查詢後:

Array 
(
    [0] => 0D6131 
) 
Array 
(
    [0] => 0D6132 
) 
Array 
(
    [0] => 0D6133 
) 
+1

'0D'是回車('\ r')。 (而'61'爲'A','30'''39'爲數字'0'-'9'。)當我用'LINES TERMINATED BY'/// \ r「'查詢時,它會導入CSV在我的MySQL 5.1.49上完全正確。 – Palec

回答

3

正確的查詢

您CSV有三個斜槓和回車符分隔行。只需在您的查詢中使用LINES TERMINATED BY "///\r"即可使用。至少它適用於我的MySQL 5.1.49。

LOAD DATA LOCAL INFILE "temp/test.csv" 
INTO TABLE test 
FIELDS TERMINATED BY "," 
LINES TERMINATED BY "///\r" 
IGNORE 1 LINES (one, two, three, four, five) 

調試不可打印的字符

當有關不可打印字符是什麼疑問,您可以隨時看hexdump都和手動解碼的字符。通常這些字符是ASCII。在* NIX上,請參閱man ascii,否則請在互聯網上查看錶格(例如http://man-ascii.com/)。

在MySQL中,字符串的hexdump是由HEX()函數應用程序獲得的,例如,

SELECT HEX(one) FROM test 

在POSIX外殼,使用

od -t x1 temp/test.csv 

如果你不想成爲鐵桿,共同空白它足以將其轉換爲C轉義序列生成hexdump都可以(例如\r使用

也許更簡單(但一般難以解釋)的方法來識別EOL類型只是使用您選擇的文本編輯器,讓它告訴你回車)。 CSV是純文本格式(與二進制格式相反)。例如。在Vim中打開文件並運行se ff?。這將顯示您​​其中<EOL-type>

  • unix\n
  • dos\r\n
  • mac\r

謹防多個逃逸水平

注意之初我回答我來只是查詢,而不是PHP命令來執行它。在SQL中,一些字符是特殊的,需要從字面上轉義(字符串內部引號),其他字符通過轉義獲得它們的特殊含義(n\n)。在PHP中,SQL查詢必須放置在字符串中,在其中進行另一級別的轉義(以及不同的字符!)。另一個級別的逃跑來自例如當你從shell調用PHP爲php -r '…'

如果您想確認是否有轉義權,請在將其發送到數據庫之前打印該查詢。

$query = '…'; 
print $query; 
#$result = mysql_query($query); 

mysql API是PHP 5.5過時,在PHP 7.0

mysql API(mysql_*功能)爲deprecated in PHP 5.5removed in PHP 7.0刪除,它不會在未來版本中。請參閱PHP手冊choice of MySQL API。另見其他relevantanswers

0

從CSV文件中刪除///發生。

確保您的CSV文件以ASCII(而不是BINARY)FTP格式上傳。

然後查詢:

mysql_query("LOAD DATA LOCAL INFILE 'temp/test.csv' 
      INTO TABLE test 
      FIELDS TERMINATED BY ',' 
      LINES TERMINATED BY '\\n' 
      IGNORE 1 LINES (one, two, three, four, five)"); 
+0

我的確如你所說的那樣,從CSV中刪除了所有帶有///的單元格,將切換的傳輸模式切換爲ASCII,上傳了CSV,用您的(複製/粘貼)代替了我的查詢。沒有行以這種方式導入。 –

+0

我幾分鐘前更新了我的答案,您確定在'n'('LINES TERMINATED BY'\\ n'')之前使用了更新的兩個斜槓嗎? –

+0

是的,我試過\ n無濟於事。 –