Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP仅替换csv的一列中的数据_Php_Csv_Replace - Fatal编程技术网

PHP仅替换csv的一列中的数据

PHP仅替换csv的一列中的数据,php,csv,replace,Php,Csv,Replace,我只需要替换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!";

我只需要替换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);
$csvfile='csvfile.csv';
如果(文件_存在($csvfile)){
取消链接($csvfile);
echo“Alte$csvfile entfernt!”;
}否则{
echo“Keine alte$csvfile vorhanden”;
}
$row=0;
$fp=fopen('csvfile.csv','w');
if($handle=fopen(“oldcv.csv”,“r”)!==FALSE){
while(($data=fgetcsv($handle,200000,“,”)!==FALSE){
$num=计数($data);
$dataold=['J','N'];
$datanew=['5','0'];
echo“$num Felder在Zeile$行:

\n”; $row++; 对于($c=0;$c<$num;$c++){ fputs($fp,str_replace($dataold,$datanew,$data[$c]。“\n”); } } } fclose($fp);
您正在循环浏览CSV的每一列。为什么不直接处理具体的专栏呢?一个简单的三元组可以做到这一点

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

您正在循环浏览CSV的每一列。为什么不直接处理具体的专栏呢?一个简单的三元组可以做到这一点

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

有很多方法,你可能会得到很多答案。这里有一个:

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

有很多方法,你可能会得到很多答案。这里有一个:

switch($data[2]) {
    case 'J':
        $data[2] = '5';
        break;
    case 'N':
        $data[2] = '0';
        break;
}
fputcsv($fp, $data);
while($data=fgetcsv($handle)){
$data[2]=str_replace(['J','N',['5','0',$data[2]);
fputcsv($fp$data);
echo“”.count($data)。“Zeile中的费尔德”。$row++.:

\n”; }
编辑

  • 我删除了
    !==FALSE
    中退出,而
    为了每次不将结果与FALSE进行比较,最后
    fgetcsv()
    将返回FALSE本身并停止循环
  • 折叠的
    str_replace
    及其参数数组(仅用于可读性)
  • 删除了循环的
    ,只更改第三(
    [2]
    )列
  • 去掉了
    $num
    变量
  • while($data=fgetcsv($handle)){
    $data[2]=str_replace(['J','N',['5','0',$data[2]);
    fputcsv($fp$data);
    echo“”.count($data)。“Zeile中的费尔德”。$row++.:

    \n”; }
    编辑

  • 我删除了
    !==FALSE
    中退出,而
    为了每次不将结果与FALSE进行比较,最后
    fgetcsv()
    将返回FALSE本身并停止循环
  • 折叠的
    str_replace
    及其参数数组(仅用于可读性)
  • 删除了循环的
    ,只更改第三(
    [2]
    )列
  • 去掉了
    $num
    变量

  • 删除
    for
    循环,
    str_replace
    $data[2]
    事实上,不为,只做$data[2]整个时间。删除
    for
    循环,
    stru replace
    $data[2]
    确实,不为,只做$data[2]整个时间。@vladkras根据OP,该列只有两个值rect。第三列中的所有字段都用N或J填充。@vladkras根据OP,该列只有两个值correct。第三列中的所有字段都用N或J填充。尽管此代码可以回答该问题,但提供有关为什么和/或如何回答该问题的额外上下文将显著提高其长期价值。请在回答中添加一些解释。否。不起作用。至少对我来说不是。它还在4中的所有空字段中抛出一个“,”。列,但不会将字母更改为第3列中所需的数字。不幸的是,其他的建议似乎对我不起作用。我必须纠正我。此解决方案按其应有的方式工作。我的错误是我用一个“;”保存了“旧SCV”作为分隔符。所以我也不得不在代码中修改它
    while($data=fgetcsv($handle,200000,;”)
    非常感谢您的帮助。:)是的,我删除了答案中的第2个和第3个参数,因为它们在您的示例中是默认的,因此过多,但是如果您有
    分隔符不要放弃它们,尽管此代码可能会回答问题,但提供有关为什么和/或如何回答问题的附加上下文将显著提高其长期价值。请在回答中添加一些解释。否。不起作用。至少对我来说不是。它还在4中的所有空字段中抛出一个“,”。列,但不会将字母更改为第3列中所需的数字。不幸的是,其他的建议似乎对我不起作用。我必须纠正我。此解决方案按其应有的方式工作。我的错误是我用一个“;”保存了“旧SCV”作为分隔符。所以我也不得不在代码中修改它
    while($data=fgetcsv($handle,200000,;”)
    非常感谢您的帮助。:)是的,我删除了答案中的第2个和第3个参数,因为它们在您的示例中是默认的,因此过多,但是如果您有
    分隔符不要放弃它们