Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2017, 08:27   #1
viteklev
 
Регистрация: 29.06.2011
Сообщений: 4
По умолчанию BAT\CMD-Замена части строк в csv файле из имени файла

Добрый день!
Прошу помощи в решении проблемы:
1. В каталог D:\file\ ежедневно сохраняется файл. Имя файла имеет формат bla.bla.20171015.zip.pgp, т. е. меняются только цифры(они же дата) в имени файла.

2. В каталоге D:\txt\ находится csv-файл с большим количеством строк формата
sdfla20171014.dbf
sdsfd20171014.dbf
bbbla20171014.dbf
т.е. в начале строки случайный текст, но в конце всегда дата и расширение .dbf .

3. Требуется скопировать дату из имени файла bla.bla.20171015.zip.pgp из пункта 1 (восемь символов начиная с девятого с конца имени файла) и в csv файле из пункта 2 заменить во всех строках, начиная со второй, восемь символов начиная с пятого с конца строки тем, что скопировали, чтобы строки приняли вид
sdfla20171015.dbf
sdsfd20171015.dbf
bbbla20171015.dbf
и сохранить файл.
Желательно такое реализовать с помощью bat-файла. Если не реально, то на delphi 7.
Буду очень благодарен за помощь!

Последний раз редактировалось viteklev; 16.10.2017 в 08:33. Причина: Не верный заголовок
viteklev вне форума Ответить с цитированием
Старый 16.10.2017, 10:17   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на CMD я такое не напишу, а на Delphi это сделать несложно.
А в чём у Вас проблема написать это на Delphi?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2017, 16:05   #3
viteklev
 
Регистрация: 29.06.2011
Сообщений: 4
По умолчанию

Serge_Bliznykov, delphi -это на крайний случай, если в bat не реализую.

При помощи форумов написал такой код:

Код:
@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%i in (attach\*.dbf) do (
  set date1=%%i
  set date1=!date1:~0,-4!
  set date1=!date1:~-6!
)
  set temp=mytemp.tmp
for /F "skip=1" %%i In (send.csv) Do (
  set stroka=%%i
  ?????????????????????
  echo !stroka!>>!temp!
)
copy /y !temp! send.csv >nul
del /f /q !temp! >nul
pause
Дату из имени файла присвоил переменной date1. Потом запустил цикл, начиная со второй строки csv-файла. Результат каждого прохода цикла приплюсовывается в temp-файл и по окончанию цикла temp-файл перезаписывает исходный csv-файл.
Но главная проблема как в значении переменной stroka заменить 6 символов, начиная с пятого с конца строки, на значение переменной date1?

И еще дополнительный (второстепенный) вопрос: как сделать так, чтобы при использовании цикла for строка не разбивалась на подстроки если в ней есть пробелы?

Может быть у кого-то будут идеи?
viteklev вне форума Ответить с цитированием
Старый 17.10.2017, 16:22   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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


Цитата:
Сообщение от viteklev Посмотреть сообщение
for %%i in (attach\*.dbf) do (
а это что? в исходном условии про это ничего не было сказано. откуда Вы дату теперь берёте?



Цитата:
Сообщение от viteklev Посмотреть сообщение
Но главная проблема как в значении переменной stroka заменить 6 символов, начиная с пятого с конца строки, на значение переменной date1?
а попробуйте такой код:

Код:
rem set date1=20171017
set temp=mytemp.tmp
for /F "skip=1" %%i In (send.csv) Do (
  set stroka=%%i
  set stroka=!stroka:~0,-12!
  echo !stroka!!date1!.dbf>>!temp!
)

позволю себе ссылку привести.
на мой взгляд - полезно.
Переменные. Команда SET​ - https://vk.com/topic-73316640_31058938

Последний раз редактировалось Serge_Bliznykov; 17.10.2017 в 17:12.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2017, 17:14   #5
viteklev
 
Регистрация: 29.06.2011
Сообщений: 4
По умолчанию

Дата указана в имени файла. Этой датой необходимо заменить символы в csv-файле. В задании в 1 пункте я не верно указал формат имени файла откуда она берется и расположение этого файла. Вместо bla.bla.20171015.zip.pgp должно быть bla.bla._171015.dbf. Мне нужны были 6 символов, начиная с пятого, с конца имени.
Циклом for я присвоил переменной имя dbf-файла из каталога attach. Потом переменной удалил 4 символа с конца (.dbf). Потом взял последние 6 символов из переменной (171015). Как раз то, что мне и надо.
Скорее всего использование цикла для того чтобы переменной присвоить имя файла не правильно, т. к. в каталоге attach много dbf-файлов с подобными названиями (а нам достаточно любого одного) и программе приходится много кратно выполнять не нужные действия, но как реализовать по другому я не нашел.
viteklev вне форума Ответить с цитированием
Старый 17.10.2017, 17:49   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы код, который я выложил выше видели? проверили? работает?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2017, 17:51   #7
viteklev
 
Регистрация: 29.06.2011
Сообщений: 4
По умолчанию

Да! Код работает. То, что нужно. Serge_Bliznykov, спасибо!
viteklev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос - Открытие найденого файла по части имени LLIaMaH Microsoft Office Excel 13 02.05.2016 23:08
замена 2 произвольных строк в огромном файле polin11 Общие вопросы C/C++ 2 16.09.2015 15:24
Поиск файла в папке по части текстового имени stogs Microsoft Office Excel 2 06.05.2013 15:55
Удаление части имени файла при сохранении BDA2011 Microsoft Office Excel 4 25.01.2012 12:28
Автоматическая замена имени файла в связанной ячейке ProkVS Microsoft Office Excel 0 29.12.2010 21:25