[英]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 Separated
和Windows 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.