Войти

Показать полную графическую версию : [решено] Перенос определеной колонки в txt (структура csv) в другой txt (также csv)


Technik_spat
03-05-2025, 10:56
Уважаемые форумчане, здравствуйте!
Пришёл вновь за помощью(; И если есть "личное решение", то пишите смело в личку, понимаю, что это не школьная задача.
Есть задача, которую надо решить так, что время обработки занимало, как можно меньше времени.
Если коротко, то разработчик основного ПО (не 1С), просто стал забивать на проблемы с его кассовой программой (очень много ошибок в продажах по вине ПО) и приходиться всё решать "костылями", что бы можно было хоть как то работать на "эталонном" Фронтоле.

Есть два файла txt со структурой csv.
170722
Первый файл, это products.txt, а второй PRODUCTS33.TXT
Все строки в файлах разбросаны и не соответствуют друг другу по расположению. т.е. строка 100 в первом файле не будет соответствовать строке 100 в другом.
Т.е. надо как то сопоставить данные по ключевым цифрам в колонке 3 в первом и колонке 1 во втором - проверил, по этим ключам соответствует правильно.
Сама задача:
в первом файле надо взять данные строк в колонке 55, в ней удалить слова "ПОСТАВЩИК:" и "ПОСТУПИЛО НА СКЛАД:" и перенести в другой файл в колонку 21.
Также, из первого файла надо взять по значению в колонке 49 и проставить цифру во втором файле в колонку 23 (там сейчас все 6, т.е. надо заменить на другое значение):
если стоит 0, то это 1
если 10, то 2
если 20, то 3

Но есть два момента: в файле откуда берем данные начинаются со строки 5, а куда вставляем начинаются со строки 30.

Второе, файлы длинные и область данных необходимых для обработки заканчивается после строки $$$REPLACEDOPCODES в первом и $$$ADDBARCODES во втором соответственно. И данные после этих строк, нельзя удалять, либо менять.

Я пишу честно: что то попроще давно сам решаю cmd , здесь даже не могу понять откуда начинать((((

DJ Mogarych
03-05-2025, 23:34
Powershell, попробуйте

# Импорт
$prod = (gc 'C:\temp\products.txt' -raw) -split '\$\$\$REPLACEPRODUCT|\$\$\$REPLACEDOPCODES'
$prod33 = (gc 'C:\temp\PRODUCTS33.TXT' -raw) -split '\$\$\$REPLACEQUANTITYWITHOUTSALE|\$\$\$ADDBARCODES'

# Исходный файл в CSV
$c = (($prod1 = $prod[1] -split "`n" -match '\w')[0] -replace '[^;]').ToCharArray().count + 1
$headers = 1..$c
$prodCsv = $prod1 |ConvertFrom-Csv -Delimiter ';' -Header $headers

# Конечный файл в CSV + остальные части
$prod330 = $prod33[0] -split "`n" -match "\S"
$c = (($prod331 = $prod33[1] -split "`n" -match '\w')[0] -replace '[^;]').ToCharArray().count + 1
$headers = 1..$c
$prod33Csv = $prod331 |ConvertFrom-Csv -Delimiter ';' -Header $headers
$prod332 = $prod33[2] -split "`n" -match "\S"

# Обработка
$prod33Csv |% {
$item = $prodCsv |? 3 -eq $_.1
$_.21 = $item.55 -replace 'ПОСТАВЩИК:|ПОСТУПИЛО НА СКЛАД:'
if ($item.49 -match '^0') {$n = 1}
elseif ($item.49 -match '^10') {$n = 2}
elseif ($item.49 -match '^20') {$n = 3}
$_.23 = $n
}

# Сборка конечного файла
$result = @()
$result += $prod330
$result += '$$$REPLACEQUANTITYWITHOUTSALE'
$result += ($prod33Csv |ConvertTo-Csv -Delimiter ';' -NoTypeInformation |select -skip 1) -replace '\";\"',';' -replace '^\"|\"$' -replace '\"+','"'
$result += '$$$ADDBARCODES'
$result += $prod332

# Сохранение
$result |out-file c:\temp\result.txt

Technik_spat
04-05-2025, 09:21
Здравствуйте!
Не могу перебороть кодировку: что то у меня не выходит.
Изначально скрипт сохранял в CR, сменой "`n" на "`r`n" удалось вывести в CRLF, но вот кодировку никак по не могу победить, перепробовал :
Ascii
Asci
Default
Unicode
UTF8

170723
Проверил на 3 ПК: два win10 и один win11
Использовал powershell 7.5

DJ Mogarych
04-05-2025, 10:37
Если вы работаете в PS7 / VSCode, то там кодировка по умолчанию - это Юникод, в отличие от PS5.
В PS7 / VSCode импортируйте-экспортируйте с параметром

-Encoding windows-1251

Technik_spat
04-05-2025, 10:44
Получилось вот так:
39146;4607027769055;?????????? 1?? ?30 ???? ???? ???;?????????? 1?? ?30 ???? ???? ???;185.00;1.000000;;1;;01.08.25;;;1;;;;1;;;;?????????:?????? ????????? ?? ?????: ????.000008 ?? 01/01/24 (??????) ??????? ??????¤;;2;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;0;;;3;1;;;;;;;;;;0";

DJ Mogarych
04-05-2025, 11:01
В архиве у вас файлы с кодировкой windows-1251, на них всё нормально работает.
Возможно, сейчас вы пытаетесь обработать файлы с другой кодировкой.
Нужно точно знать, что у вас за кодировка у файлов и подобрать соответствующую.

А может быть, у вас такой текстовый редактор, который некорректно отображает результат, т. к. вы не указали, где именно у вас так получилось. Надо разбираться.

Я бы начал с того, что выполнял бы скрипт в среде Powershell ISE построчно и проверял бы результат, который получается в каждой переменной.

Technik_spat
04-05-2025, 11:27
Проверил. Нет, блокнот не причём.
Скорее всего, где то у меня в powershel не понимает.
Я пробовал предварительно конвертировать исходные файлы в utf8, не помогает

Так, нашёл решение, но в pwsh оно не работает должно.
На полностью Вашем скрипте:
Если внешним перекодировать ansi в utf8 и потом эти файлы прогнать, то выходит правильный результат, но в областях вне обработки, появляются лишние пробелы.
Если заменить "`n" на "`r`n", то пробелов нет.
Теперь буду прорабатывать правильную кодировку входящих файлов))))
СПАСИБО ОГРОМНОЕ ЗА ПОМОЩЬ!!!

DJ Mogarych
04-05-2025, 11:37
Работайте в Powershell ISE, там PS5 и не надо морочиться с кодировкой. Заодно и скрипт можно сохранить без проблем с CRLF и т. д.

Technik_spat
04-05-2025, 11:37
Единственное, а как можно не терять пробелы впереди на исходящем файле?
сейчас так (примерно):
139146;4607027769055;Глимепирид 1мг №30 табл Озон ООО;Глимепирид 1мг
а хотелось бы так:
139146;4607027769055;Глимепирид 1мг №30 табл Озон ООО;Глимепирид 1мг

DJ Mogarych
04-05-2025, 11:57
$result += ($prod33Csv |ConvertTo-Csv -Delimiter ';' -NoTypeInformation |select -skip 1) -replace '\";\"',';' -replace '^\"',' ' -replace '\"$' -replace '\"+','"'

Technik_spat
04-05-2025, 12:07
СПАСИБО!!!!
Всё получилось))))




© OSzone.net 2001-2012