PHP CSV导入问题

时间:2013-11-17 20:16:15

标签: php csv import

所以我试图让它可以通过导入CSV文件来更新MySQL数据库,唯一的问题是我看到我的一些数据有逗号,这导致数据被导入到错误的表中。这是我现有的导入代码。

if ($_FILES[csv][size] > 0) { 

  //get the csv file 
  $file = $_FILES[csv][tmp_name]; 
  $handle = fopen($file,"r"); 

  //loop through the csv file and insert into database 
  do { 
      if ($data[0]) { 
         mysql_query("INSERT INTO songdb (artist, title) VALUES 
             ( 
                 '".addslashes($data[0])."', 
                 '".addslashes($data[1])."' 
             ) 
         ") or die (mysql_error()); 
     } 
 } while ($data = fgetcsv($handle,1000,",","'")); 
 // 

 //redirect 
 header('Location: import.php?success=1'); die; 

} 

有没有办法可以将其设置为忽略CSV文件中的逗号,引号和撇号?

我还想让它设置为忽略csv中的第一行,看看它是如何只是列信息。如果可能的话。

**编辑** 例如,如果CSV包含诸如“姓氏,名字”或“用户数据”之类的数据,则这些数据实际上只是实际存在的数据的示例。每个月都会导入数据,我们刚刚注意到了这个问题。

示例数据:

  

第1栏,第2栏   项目1,描述
  第2项,说明
  项目,3,描述
  项目,4,描述
  “第5项”,说明
  “项目,6”,描述

以上是所请求的样本数据。

3 个答案:

答案 0 :(得分:1)

您可能希望使用MySQL的内置LOAD DATA INFILE语句,它不仅可以更快地工作,还可以让您使用FIELDS OPTIONALLY ENCLOSED BY '"'子句来处理这类文件。

所以你的查询会是这样的:

mysql_query(<<<SQL
    LOAD DATA LOCAL INFILE '{$_FILES['csv']['tmp_name']}'
    INTO TABLE songdb
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\\n'
    IGNORE LINES 1 (artist, title)
SQL
) or die(mysql_error());

答案 1 :(得分:0)

如果您的数据是脏的,处理此问题的最简单方法是手动清理它,并使用剥离坏字符和/或转义输入数据的数据输入表单,或者告诉正在生成此数据的用户数据停止在字段中放入逗号。

由于在用于生成此数据的任何内容中缺少转义输入,因此您的示例具有不一致的列数和不一致的字段。

那就是说,你可以做一些高级逻辑来重复使用Item之后但在空格或数字之前的任何逗号,使用正则表达式,但这有点荒谬,根据行数,它可能更容易清理在导入之前手动完成。

在跳过标题行方面,您可以这样做:

if ($_FILES[csv][size] > 0) { 

  //get the csv file 
  $file = $_FILES[csv][tmp_name]; 
  $handle = fopen($file,"r"); 
  $firstRow = false;
  //loop through the csv file and insert into database 
  do { 
      if ($data[0]) { 

         // skip header row
         if($firstRow) { 
             $firstRow=false;
             continue;
         }

         mysql_query("INSERT INTO songdb (artist, title) VALUES 
             ( 
                 '".addslashes($data[0])."', 
                 '".addslashes($data[1])."' 
             ) 
         ") or die (mysql_error()); 
     } 
 } while ($data = fgetcsv($handle,1000,",","'")); 
 // 

 //redirect 
 header('Location: import.php?success=1'); die; 

} 

哦,我刚看了你的评论,5gb。哇。手动清理不是一种选择。您需要查看数据被搞砸的可能方式的范围,并真正评估您需要使用什么逻辑来捕获正确的列。

您的示例上方是代表性示例,还是其他没有附件的字段可以使用逗号?

答案 2 :(得分:0)

试试这个,这对我来说很好。

ini_set('auto_detect_line_endings',TRUE);

$csv_data=array();

$file_handle = fopen($_FILES['file_name']['tmp_name'], 'r');

while(($data = fgetcsv($file_handle) ) !== FALSE){

    $update_data= array('first'=>$data['0'],
                        'second'=>$data['1'],
                        'third'=>$data['2'],
                        'fourth'=>$data['34']);
    // save this array in your database
}