MySQL插入以考虑随机CSV行滚动PHP

时间:2016-02-12 07:44:07

标签: php mysql excel csv

我将csv插入MySQL数据库。问题是在我的csv文件中经常出现一个名为Alternates的列,并且由于某种原因,如果它的数据很长,它会滚动到下一行,为行专用于该列的多余数据。 / p>

因此,如果列名为Alternates且数据为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,,

在它所在的行之后显示在一行上。

1 个答案:

答案 0 :(得分: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,,