2012-07-19 182 views
0

我想添加一项功能,允许wvb应用程序的用户使用CSV文件批量上传数据 - 除非数据在实际字段本身包含逗号,否则所有工作都很好。CSV文件中的逗号逗号

有很多关于这个的帖子,我已经阅读了很多关于解决这个问题的方法,主要是用双引号括住逗号,但我无法弄清楚如何为我的代码执行此操作。

最终我不能依赖用户在输入时为我做这件事,所以我需要做它作为上传过程的一部分之前,它击中数据库 - 我试图使用选项卡作为备用分隔符,但Excel似乎是非常在处理标签分离方面不一致,所以我排除了这一点。

(sanitiseData是我用整个现场清理所有的用户输入数据的功能)

 $handle = fopen($file_path, 'r'); 
     $row_count=0; 

     while (($data = fgetcsv($handle, 0, ',')) !== FALSE) { 
      if ($row_count==0) { 
       $row_count++; 
       } else { 
        $row_count++; 
        $works_id = sanitiseData($data[0]); 
        $title = sanitiseData($data[1]); 
        $first_name = sanitiseData($data[2]); 

        //Use data to insert into db 
        $sql = mysql_query("INSERT INTO csv_employee_personal (id,works_id,title,first_name) VALUES ('','$works_id','$title','$first_name')"); 
       } 
     } 

     //delete csv file 
     unlink($file_path); 
+0

你是如何创建的CSV文件? – 2012-07-19 20:32:09

+1

使用['MySQLi']( http://php.net/manual/en/book.mysqli.php)和['mysqli_query'](http://php.net/manual/en/mysqli.query.php)等。** NOT ** 'mysql _...'。 – 2012-07-19 20:32:43

+5

如果*逗号分隔值*包含未转义的逗号,则数据无效。任何分析它的尝试都是一个幸运的猜测。要求你的用户提交**有效的**数据。 – deceze 2012-07-19 20:34:05

回答

1

我假定这是你的数据是什么样子 “数据”,“数据2”,“DATA3 ,还有一些“,”data4“

我的正则表达式非常糟糕,但我认为这将是您的最佳解决方案。

同时,您可以递归地将每个字符排列在一行并跟踪逗号和字段分隔符,并且当您意识到您正在查看未被关闭的逗号时,则可以将其跳过。

如果我给U中的示例数据的数据相匹配,给我几个分钟,而我写一个函数为你逃避逗号

+0

简单地说,数据看起来像123,先生,鲍勃,当它被给予应用程序 - 问题是如果上述出现123,Mr,B,ob – bhttoan 2012-07-19 20:49:43

+0

哦,对不起,先生,不知道如何区分鲍勃的逗号名称和分隔字段的真正逗号。 – Markedagain 2012-07-19 20:53:15

+0

其可能的不好的建议,但额外的逗号总是在名称中?如果第一列始终是id,第二列是2-3字母标题abriviation,那么你可能会做一个字符串替换过去那个点 – Markedagain 2012-07-19 20:55:26