【问题标题】:Parsing CSV File to MySQL DB in PHP在 PHP 中将 CSV 文件解析到 MySQL DB
【发布时间】:2010-05-26 14:46:00
【问题描述】:

我有一个大约 350 行的 CSV 文件,其中包含属于服装、工具、娱乐等类别的各种供应商。使用以下代码,我已经能够打印出我的 CSV 文件。

<?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__); 
?>

您可能会注意到的第一件事是 list() 中的无关变量。这是因为 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 数据库。

【问题讨论】:

  • 你知道LOAD DATA INFILE吗? dev.mysql.com/doc/refman/5.1/en/load-data.html
  • 看过 MySQL LOAD DATA 命令吗?我会让 MySQL 直接处理 CSV,将所有内容移动到临时表中并从那里更新您的真实数据。为什么要在 PHP 中编写额外的管道代码?
  • LOAD DATA 的唯一问题是,如果他在服务器上实时执行此操作,他可能没有权限执行它。
  • 之前没用过LOAD DATA,我去看看,谢谢。

标签: php mysql file-io csv


【解决方案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

}

【讨论】:

  • 分类结束由一个空行指定,正如您在衣服之前看到的那样:,,,,,,,,,, 谢谢您的代码,我会考虑修改它。
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
相关资源
最近更新 更多