2016-02-12 52 views
1

我插入一个csv到MySQL数据库。这个问题经常出现在我的csv文件中,有一列名为Alternates,由于某种原因,如果数据长到一定数量,它会滚动到下一行,使其中一行专用于该列的多余数据。MySQL插入帐户随机CSV行PHP上滚动

因此,如果列被命名为候补并且数据DFE121-343431 38747 然后 38747将推广到下一行。

我需要找到一种方法来解决这个问题,并确保正在滚动的数据也将被输入到与其相关数据的其余部分相同的行中。

我会提供的

一些图像

Excel文件

enter image description here

CSV数据

enter image description here

MySQL数据库

enter image description here

请看看我的代码创建表 打开CSV文件 转换数据,并将其添加到表

$sql = "CREATE TABLE IF NOT EXISTS " . $table_name . " (
     id int(8) NOT NULL AUTO_INCREMENT, 
     wuno_product varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
     wuno_description varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
     wuno_alternates varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
     wuno_onhand varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
     wuno_condition varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
     PRIMARY KEY (id) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;"; 
      $dbh->query($sql); 

    if (($handle = fopen($csv_file, "r")) !== FALSE) { 
      fgetcsv($handle); 
      while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
       $num = count($data); 
       for ($c=0; $c < $num; $c++) { 
        $col[$c] = $data[$c]; 
       } 

     $col1 = $col[0]; 
     $col2 = $col[1]; 
     $col3 = $col[2]; 
     $col4 = $col[3]; 
     $col5 = $col[4]; 

     // SQL Query to insert data into DataBase 
     $sql = "INSERT INTO " . $table_name . "(wuno_product, wuno_description, wuno_alternates, wuno_onhand, wuno_condition) 
     VALUES('".$col1."','".$col2."','".$col3."','".$col4."','".$col5."')"; 
     $dbh->query($sql); 
     } 
     fclose($handle); 

这是一个什么样的实际CSV时像一个额外行的一个例子出现

8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58 
,,5930-01-109-7580,, 

在那种情况下

,,5930-01-109-7580,, 

在它所在的行后面显示一行。

+0

可以清理Excel文件? – Strawberry

+0

问题是我正在使用的是5k行。当它投入生产时,它将长达88k。所以我们无法花时间清理它。 – wuno

+0

如果上面的示例excel表格格式良好,它看起来如何? – Strawberry

回答

1

看来有数字和逗号之间的换行符 - 这应该给你的基础的图案来清理数据

的文件传递到fopen开始处理你可以尝试单独的行前清理数据

$csv_file='c:/temp/flaky.csv';/* change to suit your environment */ 
file_put_contents($csv_file, preg_replace("@(\r\n),@", ',', file_get_contents($csv_file))); 

/*现在fopen开放并继续*/

实施例的数据(基本上重复您所列举的例子CSV)

8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58 
,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58 
,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58 
,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 

跑了它通过清洁如上并制作了上述内容的CSV文件:

8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
8869K6X,2POLE TOGGLE SWITCH,MS90311-781,58,58,,5930-01-109-7580,, 
+0

。很抱歉,我不明白你说的是什么。你发布的代码到底是什么?您声明开始处理单个行。你是说我没有处理单个行吗? – wuno

+0

OHHHH等一下,你是说有一个逗号分隔该列中的数据? – wuno

+0

否 - 数据中有一个换行符会破坏您的csv导入。我不知道它是否总是出现在同一个点上,或者总是出现在一个数字后面,但这并不重要。我发布的代码应该打开csv文件并在'\ r \ n'字符上运行'preg_replace'并替换它们 - 用一个逗号来保持数据列相同,然后将其保存回相同的文件再次。一旦它被保存,你可以像你最初使用'fopen'和'fgetcsv'一样处理csv – RamRaider