PHP如何更改CSV文件的文本编码

PHP如何更改CSV文件的文本编码,php,Php,我有一个CSV文件,需要更改其编码。我希望能够使用PHP实现这一点。我知道有mb_convert_编码函数,但那只适用于字符串 是否有一个函数可用于更改整个csv文件的编码 干杯 更新:原来解决我问题的办法是从我的文件中删除BOM表 我正在使用下面的@treehouse代码并对其进行修改以替换bom,但它只会永远填充临时文件。怎么了 $sourcePath = 'EstablishmentExport.csv'; $tempPath = $sourcePath . 'temp'; $source

我有一个CSV文件,需要更改其编码。我希望能够使用PHP实现这一点。我知道有mb_convert_编码函数,但那只适用于字符串

是否有一个函数可用于更改整个csv文件的编码

干杯

更新:原来解决我问题的办法是从我的文件中删除BOM表

我正在使用下面的@treehouse代码并对其进行修改以替换bom,但它只会永远填充临时文件。怎么了

$sourcePath = 'EstablishmentExport.csv';
$tempPath = $sourcePath . 'temp';
$source = fopen($sourcePath, 'r');
$target = fopen($tempPath, 'w');
while(!feof($source)) {
    $line = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $source);
    fwrite($target, $line);
}
fclose($source);
fclose($target);
unlink($sourcePath);
rename($tempPath, $sourcePath);
只需填写正确的文件路径和所需的编码类型

编辑: 由于源文件显然很大,您必须逐行加载文件,这可以使用
fopen
完成。但是,您需要先将新编码的字符串写入临时文件,然后在删除原始文件后将其重命名为原始文件名:

$sourcePath = 'path/to/file.csv';
$tempPath = $sourcePath . 'temp';
$source = fopen($sourcePath, 'r');
$target = fopen($tempPath, 'w');
while(!feof($source)) {
    $line = mb_convert_encoding(fgets($source), 'ENCODING');
    fwrite($target, $line);
}
fclose($source);
fclose($target);
unlink($sourcePath);
rename($tempPath, $sourcePath);

使用()将文件内容加载到字符串中; 然后对其使用(),然后使用
()。

只要用 ,然后通过函数运行它,然后再次保存。 这就是全部


如果您的文件很大,并且无法立即将其加载到内存中,请逐行执行。(查找fopen、fgets等)

由于您正在处理一个非常大的文件,我建议通过
exec
shell\u exec
bactick
操作符将此任务留给操作系统

请看这里关于如何实现这一点的方法

例如:
shell_exec('iconv-f utf-16le-t utf-8 1.csv>2.csv')

嗯,文件也是字符串?使用
file\u get\u contents
将文件存储为字符串。我不会像那样丢失csv格式吗?嗯,不会吧?如果你只是读取一个文件的内容,你就得到了文件的确切内容。如果你把它写回去,你就把原来的写回去。这个文件是300MB,会不会太大而无法载入内存?另外,当我把它放入字符串中时,它如何保持换行符?你不必担心换行符,但是大小是一个值得关注的问题。我会想出一个解决方案。我会使用
tmpfile
php://temp
或类似的临时文件。。。还为
mb\u convert\u编码提供from编码。。。除此之外,+1.Hi,我已经意识到,不用更改编码,我只需删除BOM表来修复我的文件。我已经修改了代码,但实际上它只会永远填充临时文件。我在问题中添加了ammended代码,这是因为就在正则表达式之前,您必须编写
$line=fgets($source),以便将指针移动到下一行。现在你的循环总是保持在同一条线上。另外,
preg\u replace
必须将
$line
作为第三个参数,而不是
$source
。文件是用UTF-16LE编码的,因此fgets()是不允许的,因为它会破坏文件。你有什么建议吗?这个有效:)干杯。我编辑了你的答案以包含我的代码,这样,如果有人看到它,他们可以得到一个想法。
$sourcePath = 'path/to/file.csv';
$tempPath = $sourcePath . 'temp';
$source = fopen($sourcePath, 'r');
$target = fopen($tempPath, 'w');
while(!feof($source)) {
    $line = mb_convert_encoding(fgets($source), 'ENCODING');
    fwrite($target, $line);
}
fclose($source);
fclose($target);
unlink($sourcePath);
rename($tempPath, $sourcePath);