在报价中使用包含逗号的字段导入CSV文件?

时间:2015-06-01 21:22:48

标签: php sql csv comma fgetcsv

我从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文件中处理逗号的帖子,而且这个文件已经有双线引号的数据,正如该线程所暗示的那样,所以这不是问题。

2 个答案:

答案 0 :(得分:3)

我认为CSV解析没有任何问题。这是MySQL级别的类型强制问题。在插入1,318.02类型的列之前,您需要从float(9,2)中删除逗号。您应该插入1318.02,而不是1,318.02

而不是:

... $data[8] ...

这样做:

... str_replace(",", "", $data[8]) ...

顺便提一下,您发布的代码中可能存在一些SQL injection个漏洞,具体取决于CSV数据的来源。建议使用PDO准备好的陈述。

答案 1 :(得分:0)

没有看到问题...你在使用什么版本的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