从PHP导入上传的CSV到MySQL表时,修正LINES TERMINATED BY

时间:2014-01-23 05:26:25

标签: php mysql sql csv load-data-infile

我无法确定我的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 "///"时,数据会正确地放入我的数据库中,除了每行的第一列是“返回”然后是单元格数据的事实。这不是我想要的,我希望回归消失。

我认为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
)

2 个答案:

答案 0 :(得分:4)

正确查询

您的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。在* NIXes上,请参阅man ascii,否则请在互联网上查看表格(例如http://man-ascii.com/)。

在MySQL中,字符串的hexdump由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>

unix
    {li> \n dos {li> \r\n mac {li> \r n

注意多个转义级别

请注意,在我的回答开始时,我只编写了查询,而不是PHP命令来执行它。在SQL中,一些字符是特殊的,需要转义才能按字面意思(在字符串中引用),其他字符通过转义(\n中的php -r '…')获得它们的特殊含义。在PHP中,SQL查询必须放在字符串中,其中发生另一级别的转义(以及不同的字符!)。另一个逃脱的程度来自于当你从shell调用PHP为$query = '…'; print $query; #$result = mysql_query($query); 时。

如果您想确保获得转义权限,请在将查询发送到数据库之前打印该查询。

mysql

mysql API在PHP 5.5中已弃用,已在PHP 7.0中删除

旧的mysql_* API({{1}}函数)为deprecated in PHP 5.5removed in PHP 7.0,在将来的版本中无法使用。请参阅choice of MySQL API的PHP手册。另请参阅其他relevant answers

答案 1 :(得分: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)");