Смена кодировки файлов в Ubuntu, а так же iconv и большие файлы

Давно в категории "Ubuntu" у меня не было материалов. Сегодня я исправлюсь и выпущу сразу две статьи. Итак, начнём. вам приходилось менять кодировку текстовых файлов в linux'e? А что если объем такого файла больше 10 Gb?!

Что бы изменить кодировку файла нужно использовать замечательную утилиту iconv. В параметрах необходимо указывать исходную кодировку, а в этом нам поможет команда:

file -i file.txt

Ну а далее вот такие действия:

iconv -f WINDOWS-1251 -t UTF-8 -o output_file.txt original_file.txt

где

  • -f WINDOWS-1251 - исходная кодировка,
  • -t UTF-8 - конечная
  • -o output_file.txt - куда выводить результат
  • original_file.txt - исходный файл

Остальные ключики как обычно в man iconv.

iconv и большие файлы

Для быстрого выполнения процесса кодировки, iconv загружает файл в оперативную память и в swap. Но это работает только для небольших файлов. Если файл уж совсем большой, а ОЗУ не особо, то вы прост получите ошибку, мол "слишком большой файл", звиняйте хлопцы. Где взять такой файл? К примеру это может быть выборка из БД (игры для ipad, PC, PSP или другие данные)

Вот здесь предлагают различные решения данного вопроса: и скриптами, и разбивка на части, вывод в потоки, а потом обратно сборка в файл. Лично мне понравилось весьма простое решение: команда split - она позволяет разбить текстовый файл на более мелкие, а дальше с ними работать как угодно можно.

В простом варианте чтобы разбить файл на куски объёмом по 1Gb выполнить:

split -b 1000000000 file.txt

Это самые просты решения, эти команды можно использовать в различных скриптах и получить от этого много кайфов. Надеюсь эта заметка вам чем-то помогла.

Рубрики: 

Комментарии

Cпасибо, помогло, а вы не подскажете как узнать в какой кодировке файл? точнее его не читаемые куски
вот для примера
$content .= "

Кто онлаР
в„–Р Р…:
Нет пользователей Р В·Р В° последние 10 Р С

попробуйте функцию mb_detect_encoding(), или воспользуйтесь декодером http://www.artlebedev.ru/tools/decoder/advanced/

Спасибо за подсказку,
нужно было обработать таким образом более 500 файлов( файлы .vcf)
вот пример скрипта использующего iconv для обработки всех файлов vcf находящихся в каталоге
#!/bin/sh
mkdir konvert_vcf
for i in *.vcf ;
do
iconv -f WINDOWS-1251 -t UTF-8 -o konvert_vcf/"$i" "$i"
done

А как потом обратно файлы после сплита собрать?

Добавить комментарий