在php中转换csv并获得唯一值

时间:2014-06-02 09:48:48

标签: php csv

我想转换一个有重复内容的csv文件,我想总结数量并提取价格而不加总和。

file.csv:

code,qty,price
001,2,199
001,1,199
002,2,159
002,2,159

实际的php,它将量化相加并获得具有唯一值和总数量的结果。

<?php
$tsvFile = new SplFileObject('file.csv');
$tsvFile->setFlags(SplFileObject::READ_CSV);
$tsvFile->setCsvControl("\t");
$file = fopen('file.csv', 'w');
$header = array('sku', 'qty');
fputcsv($file, $header, ',', '"');

foreach ($tsvFile as $line => $row) {
    if ($line > 0) {
        if (isset($newData[$row[0]])) {
            $newData[$row[0]]+= $row[1];
        } else {
            $newData[$row[0]] = $row[1];
            }
}
}
foreach ($newData as $key => $value) {
    fputcsv($file, array($key, $value), ',', '"');
}
fclose($file);

?>

结果是:

code,qty
001,3
002,4

我想加价,但不加总结。

我需要的结果是:

code,qty,price
001,3,199
002,4,159

2 个答案:

答案 0 :(得分:0)

我还没有测试过这个,但我认为这就是你要找的东西:

<?php
$tsvFile = new SplFileObject('file.csv');
$tsvFile->setFlags(SplFileObject::READ_CSV);
$tsvFile->setCsvControl("\t");
$file = fopen('file.csv', 'w');
$header = array('sku', 'qty');
fputcsv($file, $header, ',', '"');

foreach ($tsvFile as $line => $row) {
    if ($line > 0) {
        if(!isset($newData[$row[0]])) {
            $newData[$row[0]] = array('qty'=>0, 'price'=>$row[2]);
        }
        $newData[$row[0]]['qty'] += $row[1];
    }
}
foreach ($newData as $key => $arr) {
    fputcsv($file, array($key, $arr['qty'], $arr['price']), ',', '"');
}
fclose($file);

?>

答案 1 :(得分:0)

首先,在PHP页面str_getcsv上有一个很好的功能,它将帮助您最终使用更易读的数组:

function csv_to_array($filename='', $delimiter=',') {
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}

这纯粹是为了易读,但现在提供了允许您处理数组的代码。

$aryInput = csv_to_array('file.csv', ',');
$aryTemp = array();
foreach($aryInput as $aryRow) {
    if(isset($aryTemp[$aryRow['code'])) {
        $aryTemp[$aryRow['code']['qty'] += $aryRow['qty'];
    } else {
        $aryTemp[$aryRow['code']] = $aryRow;
    }
}

在上面的代码中,它只是:

循环输入 检查密钥是否存在于临时数组中 如果是,则只添加新数量 如果没有,则添加整行

现在你可以写出你期待的csv文件:)