Как разделить текстовый файл построчно на несколько отдельных файлов и удалить часть строки? Бесплатно, без СМС, и без Python!
Как-то при тестировании процесса ввода в оборот маркированного товара пришлось иметь дело с большим количеством кодов SGTIN...
1. Сначала в тестовом контуре ГИС МТ (в так называемой песочнице - markirovka.sandbox.crptech.ru) была создана карточка товара, несколько дней прошло в статусе "модерация карточки", потом через обращение в техподдержку ГИС МТ она была наконец-то успешно выполнена.
Также с подсказки техподдержки был отправлен отдельный запрос в техподдержку ГИС МТ на отключение модерации для компании в тестовом контуре (нет смысла модерировать тестовый товар в песочнице :).
2. Затем был создан заказ на 100 000 кодов. Да, я решил не мелочиться! :)
ГИС МТ пыхтела 2 минуты, пока генерировала 100 тысяч кодов SGTIN.
3. После чего коды нужно "напечатать". Это можно сделать максимум:
Логично, что 100 тысяч кодов удобнее и быстрее "печатать" в формат CSV, что и было сделано.
В результате получилось 4 файла с 30 000, 30 000, 30 000 и 10 000 кодов. В этих CSV-файлах коды SGTIN были записаны построчно с длинным криптохвостом в конце:
4. Следующим шагом нужно отправить отчет о нанесении кодов (подразумевается, что напечатанные коды наклеиваются на упаковки товара, но, так как при тестировании реального товара нет - все происходит в песочнице, то и нанесение кодов тоже виртуальное).
5. Последним шагом коды вводятся в оборот. Это можно делать по 200 кодов за одну операцию, вручную добавляя их, кликнув 20 раз (очень не спортивно и не интересно), а можно это делать гораздо быстрее - с помощью добавления кодов SGTIN из файла.
Но есть ограничение: разрешенный формат файлов - XLS и XSLX, количество кодов в файле должно быть не более 5 000 шт, и коды должны быть без криптохвостов, только сам код SGTIN с маркерами регулярного выражения - 01 и 21.
Файлы с кодами у нас есть, но их формат и содержимое не соответствует требованиям :(
В результате, задача была сформулирована следующим образом:
Как из CSV-файла с 30 000 строками получить несколько отдельных XLS-файлов с 5 000 строк, у которых еще должен быть обрезан криптохвост?
Команда в одну строчку:
gc 30000_1.csv -readcount 5000 | ForEach-Object { $i=0 } { $_ -replace "(^.{31})(.{54})", ('$1') | Out-File "file${i}.xls"; $i++}
gc - сокращенный вариант команды GetContent (чтение файла);
30000_1.csv - исходный многострочный файл, который нужно разделить на несколько с меньшим количеством строк;
-readcount 5000 - читать исходный файл по 5 000 строк;
-replace "(^.{31})(.{54})", ('$1') - разбить каждую строку файла на 2 части: первая часть - 31 символ (с 1 по 31 символы) и вторая - 54 символа (с 32 по 85 символы) и оставить только первую часть (заменить 2 части на одну - первую);
file${i}.xls - маска для имени файлов на выходе, вместо ${i} будет инкремент числа от 0 и далее. По факту это будет TXT-файл, расширение можно указать как TXT, так и CSV или XLS - просто для дальнейшего использования нужен был как раз массив строк в XLS-файле.
Результат обработки:
Теперь можно последовательно использовать полученные файлы и вводить в оборот коды SGTIN по 5 000 шт. за операцию.
Команду для Powershell можно написать чуть лаконичнее - таким образом:
gc 30000_1.csv -readcount 5000 | ForEach-Object { $i=0 } { $_ -replace "(^.{31})(.*)$", ('$1') | Out-File "file${i}.xls"; $i++}
Вместо (.{54}) написать (.*)$
(этот вариант - без учета длины криптохвоста, он может быть короткий в некоторых случаях)