2016-02-12 55 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