Преобразовать шестнадцатеричное представление в юникод - PullRequest
0 голосов
/ 27 декабря 2018

Я имею дело с очень большими файлами (~ 10 Гб), содержащими слово с ascii представлением юникода:

Nuray \u00d6zdemir
Erol \u010colakovi\u0107 \u0160ehi\u0107

Я хочу преобразовать их в юникод перед вставкой в ​​базу данных, например так:

Nuray Özdemir
Erol Čolaković Šehić

Я видел, как делает это с vim , но это очень медленно для очень большого файла.Я думал, что копирование / вставка регулярного выражения будет в порядке, но это не так.

Я на самом деле получаю такие вещи:

$ echo "Nuray \u00d6zdemir" | sed -E 's/\\\u(.)(.)(.)(.)/\x\1\x\2\x\3\x\4/g'
Nuray x0x0xdx6zdemir

Как я могу объединить \x изначение \1 \2 ...?

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

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Предполагая, что юникоды в вашем файле находятся в BMP (16 бит), как насчет:

perl -pe 'BEGIN {binmode(STDOUT, ":utf8")} s/\\u([0-9a-fA-F]{4})/chr(hex($1))/ge' input_file > output_file

Вывод:

Nuray Özdemir
Erol Čolaković Šehić

Я сгенерировал файл 6 Гб для проверки эффективности скорости,Это заняло ок.10 минут, чтобы обработать весь файл на моем 6-летнем ноутбуке.Я надеюсь, что это будет приемлемо для вас.

0 голосов
/ 27 декабря 2018

Я вообще не специалист по mongoDB, но могу вам сказать следующее:

Если есть способ сделать это при импорте непосредственно в движке БД, это решение следует использовать,теперь, если эта функция недоступна.

Вы можете использовать любой наивный подход для ее решения:

while read -r line; do echo -e "$line"; done < input_file

INPUT:

cat input_file
Nuray \u00d6zdemir
Erol \u010colakovi\u0107 \u0160ehi\u0107

ВЫХОД:

Nuray Özdemir
Erol Čolaković Šehić

Но, как вы заметили, вызов echo -e в каждой строке создаст ресурсоемкое изменение контекста (создайте подпроцесс для echo -> выделение памяти, новая запись в таблице процессов, управление приоритетами, переключение обратно на родительский процесс), что неэффективно для файлов объемом 10 ГБ.

Или используйте более разумный подход с использованием инструментов, которые должны быть доступныв вашем дистрибутиве пример:

whatis ascii2uni 
ascii2uni (1)        - convert 7-bit ASCII representations to UTF-8 Unicode

Команда:

ascii2uni -a U -q input_file 
Nuray Özdemir
Erol Čolaković ᘎhić

Вы также можете разделить (например, split команда) входной файл на части, параллельно выполнить этап преобразования на каждомвложенный файл, и импортируйте каждый преобразованный кусоккак только станет доступно сокращение общего времени выполнения.

...