我无法确定我的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 BY
与MS-DOS Comma Separated
和Windows Comma Separated
文件的提及。
运行查询后SELECT HEX(one) FROM test
的结果:
Array
(
[0] => 0D6131
)
Array
(
[0] => 0D6132
)
Array
(
[0] => 0D6133
)
答案 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中,使用
生成hexdumpod -t x1 temp/test.csv
如果你不想成为那个硬核,对于普通的空白来说,使用
将它转换为C转义序列(例如\r
以便回车)就足够了
od -c temp/test.csv
可能更简单(但通常更难解释)识别EOL类型的方法只是使用您选择的文本编辑器并让它告诉您。 CSV是纯文本格式(与二进制格式相反)。例如。在Vim中打开文件并运行se ff?
。这会显示fileformat=<EOL-type>
<EOL-type>
unix
\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.5和removed 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)");