Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Перенос определеной колонки в txt (структура csv) в другой txt (также csv)

Ответить
Настройки темы
Любой язык - [решено] Перенос определеной колонки в txt (структура csv) в другой txt (также csv)

Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:56, 03-05-2025

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6667
Благодарности: 1553

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:34, 03-05-2025 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Последний раз редактировалось Technik_spat, 08-05-2025 в 11:58.


Отправлено: 09:21, 04-05-2025 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6667
Благодарности: 1553

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 04-05-2025 в 10:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:37, 04-05-2025 | #4


Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:44, 04-05-2025 | #5


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6667
Благодарности: 1553

Профиль | Отправить PM | Цитировать


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

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

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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:01, 04-05-2025 | #6


Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 11:27, 04-05-2025 | #7


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6667
Благодарности: 1553

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 11:37, 04-05-2025 | #8


Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:37, 04-05-2025 | #9


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6667
Благодарности: 1553

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$result += ($prod33Csv |ConvertTo-Csv -Delimiter ';' -NoTypeInformation |select -skip 1) -replace '\";\"',';' -replace '^\"','       ' -replace '\"$' -replace '\"+','"'

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:57, 04-05-2025 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Перенос определеной колонки в txt (структура csv) в другой txt (также csv)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Копирование колонок из dbf в txt (csv) Technik_spat Скриптовые языки администрирования Windows 12 13-01-2024 06:57
CMD/BAT - Выборочное копирование по значению в txt (csv) файлах Technik_spat Скриптовые языки администрирования Windows 4 05-06-2021 11:27
PowerShell - [решено] AD: *.txt DisplayName -> *.csv sAMAccountName it3 Скриптовые языки администрирования Windows 1 08-09-2019 08:21
CMD/BAT - txt в csv porokh Скриптовые языки администрирования Windows 30 31-01-2019 19:02
txt to csv vanoman Хочу все знать 2 06-09-2014 11:51




 
Переход