转换csv在php和获得唯一的值


Convert csv in php and get unique value

我想转换一个具有重复内容的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

我还没有测试过这个,但我认为这是你正在寻找的:

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

首先,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文件了:)