簡體   English   中英

從PHP導入上傳的CSV到MySQL表時,更正LINES TERMINATED BY

[英]Correct LINES TERMINATED BY when importing uploaded CSV into MySQL table from PHP

我在確定CSV線是如何終止時遇到麻煩。 我正在使用以下PHP代碼將數據從CSV加載到數據庫中。

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 "///" ,數據將正確地放入數據庫中,除了每一行的第一列是“ return”,其后是單元格數據。 那不是我想要的,我希望回報消失。

我認為CSV中最后一列單元格/// ,return和第一列單元格的序列被///分割,並且應該被/// + return分割。 我應該更改LINES TERMINATED BY 我嘗試過\\n\\r\\r\\n\\n\\r 一段時間后,我嘗試<br>並知道需要幫助。

我在Mac上使用MS Office,並將CSV保存為Comma Separated Values (.csv)示例 )。 我也嘗試過使用MS-DOS Comma SeparatedWindows Comma Separated文件來LINES TERMINATED BY提到的行。

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

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

正確查詢

您的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)

調試不可打印的字符

如果對無法打印的字符有疑問,可以隨時查看十六進制轉儲並手動解碼字符。 通常這些字符是ASCII。 在* NIXes上,請參閱man ascii ,否則請在Internet上查找表格(例如http://man-ascii.com/ )。

在MySQL中,通過HEX()函數應用程序獲取字符串的HEX() ,例如

SELECT HEX(one) FROM test

在POSIX shell中,hexdump是使用以下命令生成的

od -t x1 temp/test.csv

如果您不想成為那種頑固的人,那么對於常見的空格,只需使用以下命令將其轉換為C轉義序列即可(例如\\r表示回車)

od -c temp/test.csv

也許甚至更簡單(但通常很難解釋)的方法來確定EOL類型,只是使用您選擇的文本編輯器並讓它告訴您。 CSV是純文本格式(與二進制格式相反)。 例如在Vim中打開文件並運行se ff? 這將顯示fileformat=<EOL-type> ,其中<EOL-type>

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

提防多個轉義級別

請注意,在回答的開頭,我只寫了查詢,而不是執行它的PHP命令。 在SQL中,某些字符是特殊的,需要逃到字面(報價內字符串),其他的獲得他們的特殊意義,通過逃逸( n\\n )。 在PHP中,SQL查詢必須放在字符串中,在該字符串中會進行另一級轉義(並針對不同的字符!)。 例如,當您從shell以php -r '…'調用PHP時,就會轉義另一個層次。

如果要確保轉義正確,請在將查詢發送到數據庫之前打印查詢。

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

mysql API在PHP 5.5中已棄用,在PHP 7.0中已刪除

PHP 5.5棄用了舊版mysql API( mysql_*函數) ,PHP 7.0中已將其刪除 ,以后的版本中將不再提供。 有關MySQL API的選擇,請查閱PHP手冊。 另請參閱其他相關 答案

從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)");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM