Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Перенос определеной колонки в txt (структура csv) в другой txt (также csv) (http://forum.oszone.net/showthread.php?t=356292)

Technik_spat 03-05-2025 10:56 3037678

Перенос определеной колонки в txt (структура csv) в другой txt (также csv)
 
Уважаемые форумчане, здравствуйте!
Пришёл вновь за помощью(; И если есть "личное решение", то пишите смело в личку, понимаю, что это не школьная задача.
Есть задача, которую надо решить так, что время обработки занимало, как можно меньше времени.
Если коротко, то разработчик основного ПО (не 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 3037690

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 3037695

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

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

DJ Mogarych 04-05-2025 10:37 3037696

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

-Encoding windows-1251

Technik_spat 04-05-2025 10:44 3037697

Получилось вот так:
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 3037698

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

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

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

Technik_spat 04-05-2025 11:27 3037699

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

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

DJ Mogarych 04-05-2025 11:37 3037701

Работайте в Powershell ISE, там PS5 и не надо морочиться с кодировкой. Заодно и скрипт можно сохранить без проблем с CRLF и т. д.

Technik_spat 04-05-2025 11:37 3037702

Единственное, а как можно не терять пробелы впереди на исходящем файле?
сейчас так (примерно):
Код:

139146;4607027769055;Глимепирид 1мг №30 табл Озон ООО;Глимепирид 1мг
а хотелось бы так:
Код:

      139146;4607027769055;Глимепирид 1мг №30 табл Озон ООО;Глимепирид 1мг

DJ Mogarych 04-05-2025 11:57 3037703

Код:

$result += ($prod33Csv |ConvertTo-Csv -Delimiter ';' -NoTypeInformation |select -skip 1) -replace '\";\"',';' -replace '^\"','      ' -replace '\"$' -replace '\"+','"'

Technik_spat 04-05-2025 12:07 3037704

СПАСИБО!!!!
Всё получилось))))


Время: 11:55.

Время: 11:55.
© OSzone.net 2001-