PHP 仅替换一列 csv 中的数据



我只需要替换csv中第三列的值。没有其他地方。我的 csv 的第 3 列仅包含"J"或"N",我需要将它们更改为"5"或"0"。但是现在我总是改变整个文件中找到的所有 N 和 J#。但我只需要在第三列中更新它。

我使用以下代码打开并重写我的 csv。但它总是将所有找到的字母写到 5 或 0。

$csvfile = 'csvfile.csv';
if (file_exists($csvfile)) {
        unlink($csvfile);
    echo "Alte $csvfile entfernt!";
} else {
    echo "Keine alte $csvfile vorhanden";
}
$row = 0;
$fp = fopen('csvfile.csv', 'w');
if (($handle = fopen("oldCSV.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 200000, ",")) !== FALSE) {
    $num = count($data);
    $dataold = ['J', 'N'];                                                            
    $datanew = ['5', '0'];
    echo "<p> $num Felder in Zeile $row: <br /></p>n";
    $row++;
    for ($c=0; $c < $num; $c++) {
        fputs($fp, str_replace($dataold, $datanew, $data[$c] . "n"));
    }
  }
}
fclose($fp);
while ($data = fgetcsv($handle)) {
    $data[2] = str_replace(['J', 'N'], ['5', '0'], $data[2]);
    fputcsv($fp, $data);
    echo "<p> ".count($data)." Felder in Zeile ".$row++.": <br /></p>n";
}

编辑

  1. 我从while中删除了!== FALSE部分,以免每次都将结果与 false 进行比较,最后fgetcsv()将返回 false 本身并停止循环
  2. 折叠的str_replace及其参数数组(仅用于可读性)
  3. 删除for循环以仅更改第 3 ([2] ) 列
  4. 摆脱了$num变量

有很多方法,你可能会得到很多答案。 这是其中之一:

switch($data[2]) {
    case 'J':
        $data[2] = '5';
        break;
    case 'N':
        $data[2] = '0';
        break;
}
fputcsv($fp, $data);

您正在循环浏览 CSV 的每一列。为什么不只处理特定列?一个简单的三元可以做到这一点

$data[2] = ($data[2] == 'J') ? '5' : '0'; 

相关内容

最新更新