【问题标题】:Edit CSV field value for entire column编辑整列的 CSV 字段值
【发布时间】:2014-08-24 19:54:22
【问题描述】:

我有一个 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!";
}


?>

请有人指出我正确的方向,解释一下你是如何计算出这个函数的,这样我就可以同时学习了。

【问题讨论】:

  • 您能从您的 CSV 文件中添加一些示例数据吗?

标签: php csv fgetcsv fputcsv


【解决方案1】:

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


其他观点:

如果您在此数据(csv)处理的生命周期中只做一次,请尝试仅使用 mysql 本身来解决它。创建类似于数据库的表,将 .csv 数据导入到该 mysql 表中。然后,SQL 随心所欲地运行。

没有循环;无需编码,无需文件读/写,并且可以精确控制要使用 UPDATE 执行的操作。您只需要注意分隔符(行分隔符,例如 \r\n,列分隔符(例如,逗号或制表符或分号)以及双/单引号中的数据编码与否)

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

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

【讨论】:

    【解决方案2】:

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

    $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 文件生成一行。请参阅官方文档中的 implode ...

    在我关闭与文件的连接后。并且'当您可以一口气写入第二个文件时,与两个文件建立连接是没有用的。小文件也是如此

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 2011-08-15
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多