2010-05-26 45 views
0

我有一個大約350行的CSV文件,其中包含各種各樣的供應商,可以分爲服裝,工具,娛樂等類別。使用下面的代碼,我已經能夠打印出我的CSV文件。在PHP中解析CSV文件到MySQL數據庫

<?php 
    $fp = fopen('promo_catalog_expanded.csv', 'r'); 
    echo '<tr><td>'; 
    echo implode('</td><td>', fgetcsv($fp, 4096, ',')); 
    echo '</td></tr>'; 
    while(!feof($fp)) { 
     list($cat, $var, $name, $var2, $web, $var3, $phone,$var4, $kw,$var5, $desc) = fgetcsv($fp, 4096); 
     echo '<tr><td>'; 
     echo $cat. '</td><td>' . $name . '</td><td><a href="http://www.' . $web .'" target="_blank">' .$web.'</a></td><td>'.$phone.'</td><td>'.$kw.'</td><td>'.$desc.'</td>' ; 
     echo '</td></tr>'; 
    } 

    fclose($file_handle); 
    show_source(__FILE__); 
?> 

您可能會注意到的第一件事是列表()中的無關變量。這是因爲怎樣的Excel電子表格/ CSV文件:

Category,,Company Name,,Website,,Phone,,Keywords,,Description 
,,,,,,,,,, 
Clothes,,4imprint,,4imprint.com,,877-466-7746,,"polos, jackets, coats, workwear, sweatshirts, hoodies, long sleeve, pullovers, t-shirts, tees, tshirts,",,An embroidery and apparel company based in Wisconsin. 
,,Apollo Embroidery,,apolloemb.com,,1-800-982-2146,,"hats, caps, headwear, bags, totes, backpacks, blankets, embroidery",,An embroidery sales company based in California. 

有一點要注意的是,最後一行用兩個逗號開始,因爲它也內「衣服」類別中列出。

我擔心的是我正在討論CSV輸出錯誤。

我應該使用foreach循環而不是此列表方式嗎?
我應該首先擺脫任何不必要的空白列嗎?

請告知您可能會發現的任何缺陷,我可以使用的改進,以便我可以準備將​​此數據導入到MySQL數據庫。

+5

你知不知道'LOAD DATA INFILE '? http://dev.mysql.com/doc/refman/5.1/en/load-data.html – 2010-05-26 14:50:35

+0

曾經看過MySQL'LOAD DATA'命令?我會讓MySQL直接處理CSV,將所有內容移動到臨時表中並從那裏更新您的真實數據。爲什麼要在PHP中編寫額外的管道代碼? – Tomalak 2010-05-26 14:52:21

+0

LOAD DATA唯一的問題是,如果他在服務器上執行此操作,他可能沒有執行它的權限。 – prodigitalson 2010-05-26 15:12:10

回答

1

林不知道您的CSV的整體結構 - 它很難使基於兩行規則的假設......但像下面應該工作:

$fp = fopen('promo_catalog_expanded.csv', 'r'); 

// normalize the column names 
$columns = array_change_key_case(fgetcsv($fp, 0, ','), CASE_LOWER); 
$lastCategory = null; 

while(false !== ($data = fgetcsv($fp, 0, ','))) { 
    $data = array_combine($columns, $data); // make it an assoc array 

    // test if category has a value - if it doesnt use the last category 
    if(empty($data['category']) && null !== $lastCategory){ 
     $data['category'] = $lastCategory; 
    } 

    // if we have started a new set of entries for a cat, we need to make it the $lastCategory 
    if($lastCategory !== $dataCategory && null !== $data['category']) { 
     $lastCategory = $data['category']; 
    } 

    // your sql to do the insert 

} 
+0

類別的結尾是由一個空行指定的,正如您在開始之前所看到的那樣:',,,,,,,,,,' 謝謝您的代碼,我會考慮修改它。 – Austin 2010-05-26 15:15:10