CSV,将多行数据合并为单行并放入同一列

时间:2014-07-09 16:55:42

标签: php mysql csv

media_gallery_image         category        sku         created_at          price
/c/u/cutting_shafts.jpg     Specials        01mb        3/19/2013 22:59     1487
/s/h/shred_bin_3.jpg        Cross Cut 
/e/c/ecc_switch_3.jpg       Destroyit 
/2/6/2604ccm.jpg            Commercial 
                            Paper Phoenix           

这些是CSV文件中一个产品的详细信息。对于这个产品,它向我展示了sku,创建日期,价格和多个类别&画廊图片。

现在的问题是它显示第一个媒体库图像,第一类,sku为01mb,日期为2013年3月19日22:59,价格为1487一行,

然后在第二行它显示第二个图库图像,第二个类别,sku为空白,日期为空白,价格为空白

然后在第3行(与第2行相同),依此类推。

我有这样的100种产品,它们都有多个图像,类别但没有显示在与上面相同的产品数据行中。我想合并所有媒体库图像在同一行和相同的列中用逗号(,)分隔。例如 "/c/u/cutting_shafts.jpg, /s/h/shred_bin_3.jpg, /e/c/ecc_switch_3.jpg, /2/6/2604ccm.jpg"

和类别列相同。

是否可以通过php编辑和更新CSV来实现这一目标?

更新

以下是所需内容的屏幕截图: - enter image description here

1 个答案:

答案 0 :(得分:0)

以下执行与group by类似的操作,并在指定为参数的列上合并。它可能用于做你想做的事情:

<?php

function setup_row($groups, $row){
  $res = $row;
  array_map(function($v) use(&$res,$row){
      $res[$v] = array($row[$v]);
    },$groups);
  return $res;
}

function concat_row($groups, $coalesces, $row, &$merge){
  array_map(function($v) use ($row, &$merge) {
      if (isset($row[$v]) && $row[$v] != "")
        $merge[$v][] = $row[$v]; // add to group concat columns
    },$groups);
  array_map(function($v) use ($row, &$merge) {
      if (isset($row[$v]) && $row[$v] != "")
        $merge[$v] = $row[$v]; // coalesce columns
    },$coalesces);
}

function implode_row($groups, $merge){
  array_map(function($v) use (&$merge) {
      $merge[$v] = implode(',', $merge[$v]);
    },$groups);
  return $merge;
}

function csv_group_by($groups, $coalesces, $group_by, $infile, $outfile){
  $current_group = "";
  $result;
  if (($hin = fopen($infile, "r")) !== FALSE &&
      ($hout = fopen($outfile, "w")) !== FALSE) {
    while (($row = fgetcsv($hin, 0, ",")) !== FALSE) {
      if ($row[$group_by] != $current_group){
        if (isset($merge)){
          $result = implode_row($groups, $merge);
          fputcsv($hout, $result,',');
        }
        $merge = setup_row($groups, $row);
      } else {
        concat_row($groups, $coalesces, $row, $merge);
      }
    }
    if (isset($merge)){
      $result = implode_row($groups, $merge);
      fputcsv($hout, $result,',');
    }
    fclose($hin);
    fclose($hout);
  }
}

csv_group_by(array(1,2), array(), array(5),”infile”,"outfile");

?>

outfileoutfile替换为您在最后一行中所需的文件名。

或者用

之后的函数替换脚本的结尾
If (count($argv) == 3)
    csv_group_by(array(1,2), array(), array(5),$argv[1],$argv[2]);

?>

并在命令行中调用脚本,如下所示:

$ php script.php <infile> <outfile>

<infile><outfile>具有预期含义。

哦,脚本希望csv文件以逗号分隔,你必须编辑代码才能改变这种行为。