编辑整列的CSV字段值

时间:2014-08-24 19:54:23

标签: php csv fgetcsv fputcsv

我有一个CSV,每晚都会以批发价格从批发商那里下载。

我需要做的是编辑价格列(第2列)并将当前值乘以1.3(30%)。

我的代码用于阅读提供的CSV并仅列出我需要的列,但我似乎无法弄清楚如何编辑价格列。

<?php
// open the csv file in write mode
$fp = fopen('var/import/tb_prices.csv', 'w');

// read csv file
if (($handle = fopen("var/import/Cbl_4036_2408.csv", "r")) !== FALSE) {
$targetColumns = array(1, 2, 3); // get data from the 1st, 4th and 15th column

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {   
    $targetData = array();                  // array that hold target data
    foreach($targetColumns as $column){  // loop throught the targeted columns array
        if($column[2]){
            $data[$column] = $data[0] * 1.3;
        }
        $targetData[] = $data[$column]; // get the data from the column

    }
    # Populate the multidimensional array.
    $csvarray[$nn] = $targetData;       // add target data to csvarray
    // write csv file
    fputcsv($fp, $targetData);       
}
fclose($handle);
fclose($fp);

echo "CSV File Written Successfully!";
}


?>

请有人指出我正确的方向,解释你是如何计算出这个功能的,所以我可以同时学习。

2 个答案:

答案 0 :(得分:0)

您将价格列始终乘以 - $ data [0] * 1.3。 这可能是错的。


其他观点:

如果您在此数据(csv)处理的生命周期中执行过一次,请尝试仅使用mysql本身解决它。创建类似于数据库的表,将.csv数据导入到该mysql表中。然后,SQL可以根据需要运行。

没有循环;没有编码,没有文件读/写,以及对UPDATE要做什么的精确控制。你只需要知道分隔符(行分隔符,例如。\ r \ n,列分隔符(例如逗号或制表符或分号)和双/单引号中的数据编码)

修改数据后,可以再次将其导出回csv。

如果要处理.csv文件本身,请在一个连接中打开它(只读模式),然后写入另一个文件 - 保存原始数据。

答案 1 :(得分:0)

你说包含价格的列是第二个,但然后使用该索引为零。无论如何,整个事情可以更容易

$handle = fopen("test.csv", "r");
if ( $handle !== FALSE) {
    $out = "";
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $data[1] = ((float)$data[1] * 1.3);
        $out .= implode(";",$data) . "\n";
    }
    fclose($handle);
    file_put_contents("test2.csv", $out);
}

此代码用逗号作为分隔符打开一个csv文件。 比读取每一行和每一行它将第二列(索引1)乘以1.3

这一行

$out .= implode(";",$data) . "\n";

为新的csb文件生成一行。看到破旧的文件......

关闭与文件的连接后。当你可以一举写下第二个文件时,无法连接两个文件。小文件的确如此