Мне нужно конвертировать файл CSV в UTF-8 и переименовать его с помощью сценария PHP.
Следующий код работал на моем ПК, но теперь мне нужно сделать это на сервере как задачу CRON
iconv -f UTF-16LE -t UTF-8 OLD-FILE.csv > NEW-FILE.csv
Любой знает эквивалент в PHP. Большое спасибо.
Простой способ — загрузить CSV-файл в строку с помощью этой команды:
Затем вы можете UTF-8 кодировать строку с помощью этой команды:
Наконец, запишите строку в файл, используя file_put_contents.
Готовый код может выглядеть так:
$file_data = file_get_contents('/my/path/to/file.csv');
$utf8_file_data = utf8_encode($file_data);
$new_file_name = '/my/path/to/new_file.csv';
file_put_contents($new_file_name , $utf8_file_data );
Убедитесь, что веб-сервер имеет правильные разрешения на чтение и запись в соответствующих местах.
Вот ссылка на file_put_contents()
:
если iconv доступен, вы можете использовать PHP-эквивалент: http://php.net/manual/en/function.iconv.php обратите внимание, что это занимает строку, вам нужно будет прочитать в файле http://php.net/manual/en/function.fread.php а потом выпиши http://php.net/manual/en/function.file-put-contents.php но этот подход может быть медленнее и для больших файлов, он потребует загрузки файла в память.
Итак, вот решение, которое я нашел благодаря нашему мозговому штурму:
<?php
$file_data = file_get_contents('/home/MYFILE.csv');
//$utf8_file_data = utf8_encode($file_data);
$utf8_file_data = mb_convert_encoding($file_data, "UTF-8", "UTF-16LE");
//$utf8_file_data = iconv("UTF-16LE","UTF-8",$file_data);
$new_file_name = '/home/MYFILE_NEW.csv';
file_put_contents($new_file_name , $utf8_file_data );
?>
Единственное преимущество в том, что выходной размер в два раза больше входного. Если я использую ICONV на моем ПК, то это ПОЛОВИННЫЙ размер …
Если кто-нибудь знает, я хотел бы услышать почему.