Как можно заменить текст в файле .csv, используя язык PHP?

Здравствуйте. У меня есть проблема с функцией str_replace(), которая, по-видимому, заменяет значения только в файлах с расширением .xml. Можете ли вы помочь мне разобраться с этим? Вот пример кода: 

<pre><code class="php">&lt;?php 

	$files_parameters = [
		[		
			'name' =&gt;  'uploads/loaded-3.csv',
			'result' =&gt; 'uploads/decode-3.csv',
			'change-from' =&gt; 'Российский рубль',
			'change-to' =&gt; 'RUB'
			
			]
	];
	
	foreach($files_parameters as $file) {

		if (file_exists($file['name'])) {
			$source = @fopen($file['name'],'r');
			if ($source) {	
				$target = @fopen($file['result'],'w+');
				$f = 0;
				while (!@feof($source)) {	
					$st = @fgets($source, 4096);
					$pos = strpos($st, $file['change-from']);
					if ($pos or $f) {	
	
						$st = str_replace($file['result'], $file['change-to'], $st);
						if (substr_count($st, '&lt;/param&gt;')) {
							$f = 0;
							$st = str_replace('param', 'art', $st);
						} else $f = 1;
							
					}
					fwrite($target, $st);
				}	
					
				@fclose($source);
				@fclose($target);
			}
		}	

	}

		
?&gt;</code></pre>
  • 13 января 2025 г. 11:23
Ответы на вопрос 2
В вашем коде есть несколько моментов, которые требуют исправления, чтобы текст в файле .csv заменялся корректно. Прежде всего, вы неправильно используете функцию `str_replace`. Вместо поиска строки `change-from` вы случайно ищете значение `result`, которое является именем выходного файла. 

Вот обновленный пример кода, который исправляет эту проблему:

```php
<?php 

$files_parameters = [
    [       
        'name' =>  'uploads/loaded-3.csv',
        'result' => 'uploads/decode-3.csv',
        'change-from' => 'Российский рубль',
        'change-to' => 'RUB'
    ]
];

foreach($files_parameters as $file) {
    if (file_exists($file['name'])) {
        $source = @fopen($file['name'], 'r');
        if ($source) {    
            $target = @fopen($file['result'], 'w+');
            if ($target) {
                while (!@feof($source)) {    
                    $st = @fgets($source, 4096);
                    
                    // Правильная замена: 
                    $st = str_replace($file['change-from'], $file['change-to'], $st);
                    
                    // Здесь мы можем добавить дополнительные условия для замены
                    if (substr_count($st, '</param>')) {
                        $st = str_replace('param', 'art', $st);
                    }
                    
                    fwrite($target, $st);
                }   
                    
                @fclose($source);
                @fclose($target);
            } else {
                echo "Не удалось открыть файл для записи: " . $file['result'];
            }
        } else {
            echo "Не удалось открыть файл для чтения: " . $file['name'];
        }
    } else {
        echo "Файл не существует: " . $file['name'];
    }
}
?>
```

### Основные изменения:
1. **Корректная замена**: В строке `str_replace` замените значение `result` на `change-from`.
2. **Проверка на успешное открытие целевого файла**: Добавлена проверка, чтобы убедиться, что целевой файл открывается успешно.
3. **Сообщения об ошибках**: Добавлены сообщения об ошибках в случае, если не удается открыть файл для чтения или записи.

Теперь этот код должен корректно заменять текст в файле .csv, как вы и ожидаете.
Угу. Сначала понаставим @, чтобы скрыть все ошибки, а потом будем голову ломать, почему ничего не работает и ошибок не показывает. 

А вообще, это делается в одну строку.
file_put_contents($outfilename, str_replace('Российский рубль', 'RUB', file_get_contents($infilename)));
Похожие вопросы