导入包含引号中逗号的字段的 CSV 文件?
Import CSV File With Field Including Commas In Quotes?
我正在从 CSV 文件中导入以下数据,我完全无法控制其格式:
CampaignName,"""keyword""",441,11683,3.77%,2.99,112.82,"1,318.02",1.7,12,109.84
如您所见,其中一个字段有一个带有逗号分隔符的长数字,尽管该值包含在“...”中
使用以下代码将数据导入 SQL:
while (($data = fgetcsv($handle)) !== FALSE) {
$import="INSERT into ".$date."_keywords(Campaign,Keyword,Clicks,Impressions,CTR,CPC,CPM,Cost,Position,Conversions,Cost_per_conv) values('$data[0]','".mysql_real_escape_string($data[1])."','".mysql_real_escape_string($data[2])."','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]','$data[9]','$data[10]')";
mysql_query($import) or die(mysql_error());
}
即使长数字在引号内,fgetcsv 似乎无法处理它,因此将数字保存为 $1 并删除其余的引号文本。
它确实正确地拾取了所有剩余的字段 - 所以它似乎不仅仅是假设 , 是一个分隔符而 318.02 是下一个值。
问题是,我如何获得完整的号码以添加到数据库中?
编辑:我已经阅读了关于处理 CSV 文件中的逗号的其他线程,并且该文件已经按照该线程的建议在双引号中包含数据,所以这不是问题。
没看到问题...您使用的 PHP 是什么版本?
$crapData = 'CampaignName,"""keyword""",441,11683,3.77%,2.99,112.82,"1,318.02",1.7,12,109.84';
var_dump(str_getcsv($crapData));
为我提供以下输出:
array(11) {
[0]=>
string(12) "CampaignName"
[1]=>
string(9) ""keyword""
[2]=>
string(3) "441"
[3]=>
string(5) "11683"
[4]=>
string(5) "3.77%"
[5]=>
string(4) "2.99"
[6]=>
string(6) "112.82"
[7]=>
string(8) "1,318.02"
[8]=>
string(3) "1.7"
[9]=>
string(2) "12"
[10]=>
string(6) "109.84"
}
可以看到直播here。
我认为 CSV 解析没有任何问题。这是 MySQL 级别的类型强制问题。在插入 float(9,2)
类型的列之前,您需要去掉 1,318.02
中的逗号。您应该插入 1318.02
,而不是 1,318.02
。
而不是:
... $data[8] ...
这样做:
... str_replace(",", "", $data[8]) ...
顺便说一下,根据 CSV 数据的来源,您发布的代码中可能存在一些 SQL injection 漏洞。建议使用 PDO 预处理语句。
我正在从 CSV 文件中导入以下数据,我完全无法控制其格式:
CampaignName,"""keyword""",441,11683,3.77%,2.99,112.82,"1,318.02",1.7,12,109.84
如您所见,其中一个字段有一个带有逗号分隔符的长数字,尽管该值包含在“...”中
使用以下代码将数据导入 SQL:
while (($data = fgetcsv($handle)) !== FALSE) {
$import="INSERT into ".$date."_keywords(Campaign,Keyword,Clicks,Impressions,CTR,CPC,CPM,Cost,Position,Conversions,Cost_per_conv) values('$data[0]','".mysql_real_escape_string($data[1])."','".mysql_real_escape_string($data[2])."','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]','$data[9]','$data[10]')";
mysql_query($import) or die(mysql_error());
}
即使长数字在引号内,fgetcsv 似乎无法处理它,因此将数字保存为 $1 并删除其余的引号文本。
它确实正确地拾取了所有剩余的字段 - 所以它似乎不仅仅是假设 , 是一个分隔符而 318.02 是下一个值。
问题是,我如何获得完整的号码以添加到数据库中?
编辑:我已经阅读了关于处理 CSV 文件中的逗号的其他线程,并且该文件已经按照该线程的建议在双引号中包含数据,所以这不是问题。
没看到问题...您使用的 PHP 是什么版本?
$crapData = 'CampaignName,"""keyword""",441,11683,3.77%,2.99,112.82,"1,318.02",1.7,12,109.84';
var_dump(str_getcsv($crapData));
为我提供以下输出:
array(11) {
[0]=>
string(12) "CampaignName"
[1]=>
string(9) ""keyword""
[2]=>
string(3) "441"
[3]=>
string(5) "11683"
[4]=>
string(5) "3.77%"
[5]=>
string(4) "2.99"
[6]=>
string(6) "112.82"
[7]=>
string(8) "1,318.02"
[8]=>
string(3) "1.7"
[9]=>
string(2) "12"
[10]=>
string(6) "109.84"
}
可以看到直播here。
我认为 CSV 解析没有任何问题。这是 MySQL 级别的类型强制问题。在插入 float(9,2)
类型的列之前,您需要去掉 1,318.02
中的逗号。您应该插入 1318.02
,而不是 1,318.02
。
而不是:
... $data[8] ...
这样做:
... str_replace(",", "", $data[8]) ...
顺便说一下,根据 CSV 数据的来源,您发布的代码中可能存在一些 SQL injection 漏洞。建议使用 PDO 预处理语句。