SEDая древняя магия

Posted: 2014-05-13 in IT
Метки:

Три года назад я уже писал заметку, как можно обрабатывать большие выгрузки данных с помощью sed.

Недавно у меня возникла схожая задача: подготавливать файлы с тарифными планами для телефонной станции. Выгрузки эти довольно громоздкие, и вручную их обрабатывать слишком уж долго. Проблема в том, что присылают тарифы обычно в виде XLS-файла с кучей полей, с русскозыячными названиями направлений, тогда как телефонной станции нужен csv-файл, содержащий названия направлений транслитом, точные наименования полей в заголовке и ряд требований к разделителям в итоговом csv-файле.

Пример скрипта:

# CSV 2 <shaize-software> // SED
#
# Usage:
# 1. Export tariffs to CSV (7910000,"Москва (mob) -МТС","1,22")
# 2. convert csv:
# sed -f this_file.sed input_file.txt > output_file.csv

s/$/;/
s/,"/;"/g
s/,/./g

s/А/A/g
s/Б/B/g
s/В/V/g
s/Г/G/g
s/Д/D/g
s/Е/E/g
s/Ё/E/g

s/Ж/Zh/g
s/З/Z/g
s/И/I/g
s/Й/Y/g
s/К/K/g
s/Л/L/g
s/М/M/g

s/Н/N/g
s/О/O/g
s/П/P/g
s/Р/R/g
s/С/S/g
s/Т/T/g
s/У/U/g

s/Ф/F/g
s/Х/H/g
s/Ц/C/g
s/Ч/Ch/g
s/Ш/Sh/g
s/Щ/Sh/g
s/Ъ//g

s/Ы/I/g
s/Ь/'/g
s/Э/E/g
s/Ю/U/g
s/Я/Ya/g
s/а/a/g
s/б/b/g

s/в/v/g
s/г/g/g
s/д/d/g
s/е/e/g
s/ё/e/g
s/ж/zh/g
s/з/z/g

s/и/i/g
s/й/y/g
s/к/k/g
s/л/l/g
s/м/m/g
s/н/n/g
s/о/o/g

s/п/p/g
s/р/r/g
s/с/s/g
s/т/t/g
s/у/u/g
s/ф/f/g
s/х/h/g

s/ц/c/g
s/ч/ch/g
s/ш/sh/g
s/щ/sh/g
s/ъ//g
s/ы/i/g
s/ь/'/g

s/э/e/g
s/ю/u/g
s/я/ya/g

s/$/\r/


1 {
iprefix;description;voice_rate\r
}

В результате действия такого скрипта вот такой csv:

7910000,"Москва (mob) -МТС","1,32"
7910001,"Москва (mob) -МТС","1,32"
7910002,"Москва (mob) -МТС","1,32"
7910003,"Москва (mob) -МТС","1,32"

будет преобразован в такой:

prefix;description;voice_rate
7910000;"Moskva (mob) -MTS";"1.32";
7910001;"Moskva (mob) -MTS";"1.32";
7910002;"Moskva (mob) -MTS";"1.32";
7910003;"Moskva (mob) -MTS";"1.32";

Первая строка с точным названием полей, точка с запятой в конце каждой строки, точка в качестве разделителя дробной части, замена разделителя полей, транслитерация — всё это совершенно необходимые вещи, без которых загрузить правила тарификации в телефонную станцию не удастся.

Не исключаю, что с помощью офисного пакета тоже можно сделать подобное преобразование, но данный способ гораздо быстрее и надёжнее, поскольку исключен риск пропуска требуемых шагов или случайные ошибки. Тем более, что делается подобное примерно каждые 2-3 месяца — не слишком часто, чтобы постоянно помнить правила преобразования, но и не настолько редко, чтобы можно было это назвать разовой ручной работой.

Обсуждение закрыто.