导入包含引号中的逗号的字段的 CSV 文件?

Posted

技术标签:

【中文标题】导入包含引号中的逗号的字段的 CSV 文件?【英文标题】:Import CSV File With Field Including Commas In Quotes? 【发布时间】:2015-06-01 21:22:47 【问题描述】:

我正在从 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 文件中处理逗号的另一个线程,并且该文件已经包含该线程所建议的双引号中的数据,所以这不是问题。

【问题讨论】:

fgetcsv() 有一堆额外的参数来定义分隔符、引号等......使用它们。 php.net/manual/en/function.fgetcsv.php 我尝试使用如下的附件参数:while (($data = fgetcsv($handle, 1000, ",", "\"")) !== FALSE) 没有区别 也试过了:while (($data = fgetcsv($handle, 0, ",", '"')) !== FALSE) ......还是不行不同...它的价值为 $1 并忽略 ,318.02 你确定SQL中的数据类型是正确的吗?你把它设置成什么? 【参考方案1】:

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

代替:

... $data[8] ...

这样做:

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

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

【讨论】:

太棒了!那行得通。我必须在插入语句中执行以下操作: floatval(str_replace(',', '' , $data[8]))【参考方案2】:

没有发现问题...您使用的是哪个版本的 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 文件中提取数据。 fgetcsv 不是解析文件的首选函数吗? 另外,我刚刚仔细检查了 SQL 数据库,它肯定将数字导入为 1.00 而不是 1,318.02 一个六个,另一个六个。 也许您的问题与解析 CSV 数据无关,而是与列数据类型或不插入字符串而不是浮点数有关。从这里看不出来。 数据类型在SQL中设置为float(9,2)。你认为它应该是一个字符串,因为文件在“...”中吗?

以上是关于导入包含引号中的逗号的字段的 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 在文本字段中使用逗号导入 csv 文件

Pig — 如何加载包含用双引号括起来并用逗号分隔的字段的 CSV 文件

python 我发现Crystal Reports创建的CSV文件具有双引号字段,其中一些字段在引号之间包含逗号。我们不想

如何在使用 EMR/Hive 将数据从 S3 导入 DynamoDB 时处理包含在引号 (CSV) 中的字段

php解析csv时,特定汉字会导致逗号识别不出来

使用 numpy.genfromtxt 读取包含逗号的字符串的 csv 文件