Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 27.07.2019
Сообщений: 11
1

Конвертация текстовых справочников для интергации программ

21.02.2021, 14:33. Просмотров 1359. Ответов 14
Метки нет (Все метки)

Здравствуйте!
Помогите решить конвертацию текстовых справочников с определенными полями. Т.е. перестановка данных с одного поля в другое, добавление полей в конце строк и введением текстовых строк в начале файла.
Т.е. , к примеру в поле 55 стоит цифра 3,значит надо в поле 10 установить сегодняшнюю дату.
Если есть в поле 23 какое то значение, значит надо добавить ещё полей ; ; до 65 и перенести в него.
Я просто не знаю такой возможности посредством bat, простые скриты то могу формировать (архивация с удалением и переименованием, назначение включение приложений с командами), а вот с этим пока беда((((
Вообще, строка файла выглядит вот так:
49;4603988009360;Вода для инъекций буфус,N10,р-ль д/ин,5мл,Обновление;Вода для инъекций буфус,N10,р-ль д/;88.50;2.500000;;1;;01.07.25;;;1;;;00001;1;;;;2816878 от 14.07.2020 до 01.07.2025, выдан;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3;1;;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2021, 14:33
Ответы с готовыми решениями:

Конвертация справочников из Бух77 в ТиС 77
Добрый день При работе с Конвертацией 2.0 из Бух77 в ТиС 77 возникло затруднение. Переношу...

Разработка программ языке С++ для обработки текстовых файлов
14. Сформировать массив, каждый элемент которого имеет следующую структуру спортсмен=...

Очень нужны примеры реализации программ-справочников
Доброго времени суток. Мне для курсовой нужно написать проект-справочник. Например аббревиатур....

Конвертация текстовых файлов из cp1251 в utf8 (XE4)
Доброго времени суток . Нужно написать программу которая конвертирует текстовые файлы из кодировки...

14
656 / 477 / 194
Регистрация: 29.05.2016
Сообщений: 2,455
21.02.2021, 15:29 2
farmsnab, здравствуйте! Несколько сумбурно описано ТЗ. Приложите образец файла. Покажите 2 варианта по каждому случаю: до и после внесения изменений
0
㊙️
941 / 95 / 25
Регистрация: 10.08.2018
Сообщений: 297
21.02.2021, 18:54 3
Цитата Сообщение от farmsnab Посмотреть сообщение
Вообще, строка файла выглядит вот так:
Это единственная строка в файле? Если да, то вот:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
param(
    $pathIN  = "D:\file.txt",
    $pathOUT = "D:\file1.txt"
)cls
 
$data = Get-Content $path -raw
$head = 1..($data -replace "[^;]").Length
$csv  = $data|ConvertFrom-Csv -Delimiter ";" -Header $head
 
if($csv.55 -eq 3){$csv.10=date -f "dd.MM.yy"}
if($csv.23){
    ($head[-1]+1)..65|%{$csv|Add-Member -name $_ -m NoteProperty -v $null}
    $csv.65=$csv.23;$csv.23=$null
}
 
($csv | ConvertTo-Csv  -Delimiter  ";"  -NoTypeInformation|
select -Skip 1)-replace'"'|out-file $pathOUT -Encoding UTF8
start $pathOUT
1
0 / 0 / 0
Регистрация: 27.07.2019
Сообщений: 11
22.02.2021, 08:17  [ТС] 4
Нет, там таких строк более 4 000((((
0
㊙️
941 / 95 / 25
Регистрация: 10.08.2018
Сообщений: 297
22.02.2021, 12:57 5
Оставьте в файле первые строк 10 и прикрепите сюда. Первая строка - заголовки?
0
0 / 0 / 0
Регистрация: 27.07.2019
Сообщений: 11
22.02.2021, 13:02  [ТС] 6
Вот такой файл. Да, там заголовок, но его менять не нужно.
0
Вложения
Тип файла: txt PRODUCTS.TXT (5.6 Кб, 21 просмотров)
3331 / 1359 / 231
Регистрация: 10.12.2013
Сообщений: 4,641
22.02.2021, 15:50 7
farmsnab,

а из под какого софта вытащен этот формат данных ?

Добавлено через 7 минут
Цитата Сообщение от farmsnab Посмотреть сообщение
Т.е. , к примеру в поле 55 стоит цифра 3,значит надо в поле 10 установить сегодняшнюю дату.
Если есть в поле 23 какое то значение, значит надо добавить ещё полей ; ; до 65 и перенести в него.
Неудобно даже произносить это слово, но для таких действий в фиксированных полях Excel со своими макро-формулами - самое то.

( понятно, что powershell способен на всё )
0
0 / 0 / 0
Регистрация: 27.07.2019
Сообщений: 11
23.02.2021, 08:38  [ТС] 8
Цитата Сообщение от volodin661 Посмотреть сообщение
farmsnab,

а из под какого софта вытащен этот формат данных ?

Добавлено через 7 минут


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

( понятно, что powershell способен на всё )
Очень неудобно будет пользоваться "тяжелыми" приложениями.
Объясняю: это файл-выгрузки товара на кассовые места. Момент выгрузки проходит так: останавливаются кассы, происходит выгрузка продаж на текущую смену, обрабатывается в АСТУ, потом из АСТУ выгружается файл-справочник, он по флагу тут же загружается в сервер кассовых мест. Если пользоваться Excell и подобными, это ещё сверху остановка на несколько минут.
Вообще вся ситуация происходит из-за того, что разработчики аптечной АСТУ сторонние кассовые ПО не сильно хотят развивать, а отсюда просто забитие на всё то, что нужно доработать; а разработчики кассового ПО, считают, что для аптек их ПО уже доработано прекрасно, а у нас из-за этого происходят сплошные ошибки.
0
3331 / 1359 / 231
Регистрация: 10.12.2013
Сообщений: 4,641
23.02.2021, 12:41 9
farmsnab,

в любом случае так дела не делаются;
на каком-то социальном форуме в не пойми каком разделе, ничего не поясняя, ты просишь о доработке одной из функций
клиент-серверного ПО.
0
0 / 0 / 0
Регистрация: 27.07.2019
Сообщений: 11
23.02.2021, 13:12  [ТС] 10
Да, а что делать(((( Сам пока не тяну такие доработки. Мне не нужно прям файл-сценарий. Мне бы написать просто какими скриптами можно это сделать, а то уже я сам додумаю.
0
3331 / 1359 / 231
Регистрация: 10.12.2013
Сообщений: 4,641
23.02.2021, 13:17 11
Какая там база ?

Добавлено через 1 минуту
И что, нет штатной функции редактирования справочников ?
0
0 / 0 / 0
Регистрация: 27.07.2019
Сообщений: 11
23.02.2021, 13:22  [ТС] 12
Там не база, идет файл-справочник. Его перед загрузкой надо конвертнуть, что бы не было ошибок, которые я Вас попросил помочь исправить в отделе Excell.
Он выше есть в теме PRODUCTS.TXT
А база в программе Бэст-5, там я уже много раз пытался самостоятельно выгрузку переделать (не открою тайны, что даже программисты разработчики приложений для Бэст-5 не смогли переделать скрипт выгрузки, там просто темный лес основанный на таблицах dbf)
0
3331 / 1359 / 231
Регистрация: 10.12.2013
Сообщений: 4,641
23.02.2021, 14:07 13
Цитата Сообщение от farmsnab Посмотреть сообщение
Мне бы написать просто какими скриптами можно это сделать
split / внесение изменений в поля / join

инструменты: powershell / C# / perl / python : на выбор.

(первые два, скорее всего, уже есть в системе)
0
336 / 122 / 55
Регистрация: 30.01.2020
Сообщений: 284
23.02.2021, 14:18 14
Лучший ответ Сообщение было отмечено farmsnab как решение

Решение

farmsnab, Можно попробовать набросать конвертер на VBS. Его интерепретатор встроен во все версии винды, так что легко дорабатывать.
Инструкция:
1. Сохранить код в файл с расширением .vbs в ту же папку, где будет лежать исходный файл
2. Когда файл появится, просто тыкнуть в иконку файла .vbs
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'ТЗ:
'к примеру в поле 55 стоит цифра 3,значит надо в поле 10 установить сегодняшнюю дату.
'Если есть в поле 23 какое то значение, значит надо добавить ещё полей ; ; до 65 и перенести в него
option explicit
dim FSO, ff, pp, ss, aa 'описываем переменные
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set pp=FSO.OpenTextFile("PRODUCTS.TXT",1,False,0) 'откроем исходный файл на чтение
Set ff=FSO.CreateTextFile("PRODUCTS.OUT", True) ' файл в который будем писать
while not pp.AtEndOfStream
  ss = pp.readLine 'в цикле читаем строки из файла
  if Left(ss,3) = "   " Then 'если в начале строки не менее 3 пробелов - это рабочая строка. Обработаем её
    aa = Split(ss,";") ' преобразуем строку в массив строк (нумерация в массиве начинается с НУЛЯ!!!)
    if aa(54) = "3" Then 'в поле 55 стоит цифра 3
      aa(9) = Mid(Replace(cstr(date),".20","."),4) 'ставим в поле 10 сегодняшнюю дату c 2-мя последними цифрами года
    end if
    if aa(22) <> "" Then ' есть в поле 23 какое то значение
      redim Preserve aa(64)'значит надо добавить ещё полей ; ; до 65 
      aa(64) = aa(22) ' и перенести в него (если я правильно понял - перенести в 65 поле значение из поля 23)
    end if
    ss = join(aa,";")
  end if
  ff.WriteLine ss 'запишем в результирующий файл
wend
Set pp=Nothing: Set ff=Nothing: Set FSO=Nothing
Можно сделать, чтобы он прочитал весь исходный файл и писал сразу в него, чтобы встроить в этап производственного процесса. Можно сам файл скрипта не тыкать рукой, а вызывать из батника или встроить в шедулер.
1
0 / 0 / 0
Регистрация: 27.07.2019
Сообщений: 11
23.02.2021, 14:23  [ТС] 15
Цитата Сообщение от Punkt5 Посмотреть сообщение
farmsnab, Можно попробовать набросать конвертер на VBS. Его интерепретатор встроен во все версии винды, так что легко дорабатывать.
Инструкция:
1. Сохранить код в файл с расширением .vbs в ту же папку, где будет лежать исходный файл
2. Когда файл появится, просто тыкнуть в иконку файла .vbs
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'ТЗ:
'к примеру в поле 55 стоит цифра 3,значит надо в поле 10 установить сегодняшнюю дату.
'Если есть в поле 23 какое то значение, значит надо добавить ещё полей ; ; до 65 и перенести в него
option explicit
dim FSO, ff, pp, ss, aa 'описываем переменные
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set pp=FSO.OpenTextFile("PRODUCTS.TXT",1,False,0) 'откроем исходный файл на чтение
Set ff=FSO.CreateTextFile("PRODUCTS.OUT", True) ' файл в который будем писать
while not pp.AtEndOfStream
  ss = pp.readLine 'в цикле читаем строки из файла
  if Left(ss,3) = "   " Then 'если в начале строки не менее 3 пробелов - это рабочая строка. Обработаем её
    aa = Split(ss,";") ' преобразуем строку в массив строк (нумерация в массиве начинается с НУЛЯ!!!)
    if aa(54) = "3" Then 'в поле 55 стоит цифра 3
      aa(9) = Mid(Replace(cstr(date),".20","."),4) 'ставим в поле 10 сегодняшнюю дату c 2-мя последними цифрами года
    end if
    if aa(22) <> "" Then ' есть в поле 23 какое то значение
      redim Preserve aa(64)'значит надо добавить ещё полей ; ; до 65 
      aa(64) = aa(22) ' и перенести в него (если я правильно понял - перенести в 65 поле значение из поля 23)
    end if
    ss = join(aa,";")
  end if
  ff.WriteLine ss 'запишем в результирующий файл
wend
Set pp=Nothing: Set ff=Nothing: Set FSO=Nothing
Можно сделать, чтобы он прочитал весь исходный файл и писал сразу в него, чтобы встроить в этап производственного процесса. Можно сам файл скрипта не тыкать рукой, а вызывать из батника или встроить в шедулер.
Огромное спасибо)))))
Прямо выручили)))))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2021, 14:23

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Конвертация программ с Си на Паскаль
Я написал прогу на языке Си. Мне нужна прога делающая то же самое только на Паскале. Есть...

Создание программ обработка текстовых файлов
1. Составить программу, обеспечив вывод результатов расчета. 1.1 Создать файл и заполнить его...

Создание и реализация программ с использованием текстовых файлов
Даны два файла f1 и f2. Найти в файле f2 число, ближайшее по размеру до минимального значения файла...

Создание и реализация программ с использованием текстовых файлов
Пусть дан файл целых чисел. Определите есть ли числа в файле упорядочены по возрастанию.

Для всех файлов, кроме текстовых, установить атрибут "Только для чтения", а для текстовых — атрибут "Архивный"
Здравствуйте, Очень прошу помочь написать мне программу. Задание:В заданной папке для всех файлов,...

Стек технологий для набора справочников
Добрый день, подскажите плииз! Задача: написать нечто вроде &quot;телефонного справочника&quot;. Набор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.