Три года назад я уже писал заметку, как можно обрабатывать большие выгрузки данных с помощью 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 месяца — не слишком часто, чтобы постоянно помнить правила преобразования, но и не настолько редко, чтобы можно было это назвать разовой ручной работой.