Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
3 / 3 / 0
Регистрация: 26.01.2014
Сообщений: 232

Заменить в файле слова по списку из другого файла

23.02.2015, 17:53. Показов 3182. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет уважаемые специалисты не подправите код
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
setlocal enabledelayedexpansion
Set infile=1.txt
Set find=zamena
Set replace=wert
@echo off
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP.TXT
)
move TMP.TXT %infile%le%
надо сделать так что бы слова для замены брались с txt файла
спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2015, 17:53
Ответы с готовыми решениями:

Замена слова в одном файле строкой из другого файла
Здравствуйте Уважаемые Форумчане. Извиняюсь,если чтото подобное уже было, но я не нашел ответа. Вопрос в следующем: Есть файл...

Определить, есть ли в текстовом файле слова из другого текстового файла
Помогите пожалуйста с ошибкой в программе. Нужно было определить, есть ли в текстовом файле(1) слова из другого текстового файла(2). ...

В заданном текстовом файле подсчитать частоту использования каждого слова из словаря (другого текстового файла).
В заданном текстовом файле подсчитать частоту использования каждого слова из словаря (другого текстового файла). Нужно решить на С...

9
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
24.02.2015, 20:57
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
Setlocal EnableDelayedExpansion EnableExtensions
 
Set infile=1.txt
Set Replaces=r.txt
set cnt=0
 
for /f "UseBackQ tokens=1,2 delims=|" %%a in ("%Replaces%") do set/a cnt+=1& set what.!cnt!=%%a& set repl.!cnt!=%%b
 
for /F "UseBackQ tokens=* delims=," %%n in ("%infile%") do (
  set "Line=%%n"
  for /L %%c in (1,1,%cnt%) do call set "Line=%%Line:!what.%%c!=!repl.%%c!%%"
  echo !Line!>>TMP.TXT
)
move /y TMP.TXT "%infile%"
pause
Слова в файле замены разделяются знаками |
Вложения
Тип файла: zip example.zip (770 байт, 27 просмотров)
0
5 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 16
16.11.2016, 14:45
Приветствую всех!

Пытался применить представленный тут код для своих целей. Вышла такая вот громадина:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@echo off
Setlocal EnableDelayedExpansion EnableExtensions
 
:: Файлы, в котором будет хранится предыдущее состояние
set t="%~f1"$
set t1="%~f1"$$
 
set n=0
 
if exist "%t%" <"%t%" set /p n=
set /a n+=1
>"%t%" echo %n%
 
if exist "%t1%" <"%t1%" set /p n1=
set /a n1+=1
>"%t1%" echo %n1%
 
if exist "%t1%" <"%t1%" set /p n2=
set /a n2+=1
>"%t1%" echo %n2%
 
if exist "%t1%" <"%t1%" set /p n3=
set /a n3+=1
>"%t1%" echo %n3%
 
Set infile1=Epizod1.txt
Set infile2=Epizod2.txt
Set infile3=Epizod3.txt
 
Set Replaces=Glava%n%_info.txt
 
Set outfile1=Glava%n%_chast%n1%_%infile1%
Set outfile2=Glava%n%_chast%n2%_%infile2%
Set outfile3=Glava%n%_chast%n3%_%infile3%
set cnt=0
 
for /f "UseBackQ tokens=1,2 delims=|" %%a in ("%Replaces%") do set/a cnt+=1& set what.!cnt!=%%a& set repl.!cnt!=%%b
 
for /F "UseBackQ tokens=* delims=," %%n in ("%infile1%") do (
  set "Line=%%n"
  for /L %%c in (1,1,%cnt%) do call set "Line=%%Line:!what.%%c!=!repl.%%c!%%"
  echo !Line!>>TMP1.TXT
)
 
for /F "UseBackQ tokens=* delims=," %%n in ("%infile2%") do (
  set "Line=%%n"
  for /L %%c in (1,1,%cnt%) do call set "Line=%%Line:!what.%%c!=!repl.%%c!%%"
  echo !Line!>>TMP2.TXT
)
 
for /F "UseBackQ tokens=* delims=," %%n in ("%infile3%") do (
  set "Line=%%n"
  for /L %%c in (1,1,%cnt%) do call set "Line=%%Line:!what.%%c!=!repl.%%c!%%"
  echo !Line!>>TMP3.TXT
)
 
move /y TMP1.TXT "%outfile1%"
move /y TMP2.TXT "%outfile2%"
move /y TMP3.TXT "%outfile3%"
Возможно, тут есть ошибки (с кодом не на "ты"), но он работает, как мне надо. При запуске этот код берет три файла Epizod1.txt; Epizod2.txt; Epizod3.txt (содержимое у них разное), далее из файла Glava1_info.txt достает данные для замены в этих трех файлах - заменяет этими данными текст и выводит новые три файла таким образом:

Code
1
2
3
Glava1_chast1_Epizod1.txt
Glava1_chast2_Epizod2.txt
Glava1_chast3_Epizod3.txt
При повторном нажатии выйдет следующее (только тут данные для замены уже берутся из файла Glava2_info.txt):

Code
1
2
3
Glava2_chast4_Epizod1.txt
Glava2_chast5_Epizod2.txt
Glava2_chast6_Epizod3.txt
...и т.д.

Вопрос в следующем: изначальное кол-во файлов Epizod (n).txt может меняться (от 1 до 10). Как в бате быстро добавлять или убирать ненужные, как это сделать удобнее - пробую закомментировать строки - считает неверно.

А второй вопрос такой: если отсутствует следующий файл Glava(n)_info.txt (в приведенном примере это будет файл Glava3_info.txt, то не создавать следующий комплект файлов, если бат был случайно нажат.

Прикрепляю вложение, чтоб было яснее, как оно работает.
Вложения
Тип файла: 7z Book.7z (921 байт, 4 просмотров)
0
5 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 16
17.11.2016, 01:11
Небольшое уточнение в этой строке:
Цитата Сообщение от Alg Посмотреть сообщение
пробую закомментировать строки - считает неверно
На самом деле верно считает, если выставляю комментирование так:
Windows Batch file
::Set infile3=Epizod3.txt
то на выходе после первого запуска батника получаю:
Code
1
2
Glava1_chast1_Epizod1.txt
Glava1_chast2_Epizod2.txt
После второго запуска:
Code
1
2
Glava2_chast4_Epizod1.txt
Glava2_chast5_Epizod2.txt
_chast3_ здесь пропустилась и не создавалась, так как строка закомментирована (так и должно считаться).
Изначальных файлов Epizod (n).txt будет не больше 5. Текст в файлах Epizod (n) будет не более 1 страницы А4, если это важно, но совершенно разный - и цифры, и буквы, и служебные символы.

Получается вопрос только в этом:
Цитата Сообщение от Alg Посмотреть сообщение
если отсутствует следующий файл Glava(n)_info.txt (в приведенном примере это будет файл Glava3_info.txt, то не создавать следующий комплект файлов, если бат был случайно нажат.
Ну и, возможно, есть вариант привести этот код в менее громоздкую структуру?
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
17.11.2016, 01:31
Создайте в папке два файла:
Glava1_chast1_Epizod1.txt
Glava1_chast1_Epizod2.txt
запустите в этой папке такой bat с кодом:
Windows Batch file
1
2
3
4
5
6
7
8
@echo off
call :# "Glava1_chast1_Epizod.txt"
>nul pause& exit
 
:#
 set/a n+=1
 if not exist "%~n1%n%%~x1" (echo Не создаем следующий блок) else (goto #)
exit/b
и получите:
Цитата Сообщение от Alg Посмотреть сообщение
если отсутствует следующий файл Glava(n)_info.txt (в приведенном примере это будет файл Glava3_info.txt, то ...
Добавлено через 2 минуты
%n% и может не одну поставьте где надо.
0
5 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 16
17.11.2016, 13:49
alpap, запускаю батник Ваш, пишет, что файл Glava3_info.txt не найден - Не создаем следующий блок...
И все-равно создается блок этот. А нельзя в один батник это все уместить?
Цитата Сообщение от alpap Посмотреть сообщение
Создайте в папке два файла:
Glava1_chast1_Epizod1.txt
Glava1_chast1_Epizod2.txt
А тут Вы опечатались, наверное, chast1 в обоих файлах.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.11.2016, 22:28
Цитата Сообщение от Alg Посмотреть сообщение
А второй вопрос такой: если отсутствует следующий файл Glava(n)_info.txt (в приведенном примере это будет файл Glava3_info.txt, то не создавать следующий комплект файлов, если бат был случайно нажат.
В 31-ю строку дописать:
Windows Batch file
1
if not exist "%Replaces%" exit /b
Цитата Сообщение от Alg Посмотреть сообщение
Вопрос в следующем: изначальное кол-во файлов Epizod (n).txt может меняться (от 1 до 10). Как в бате быстро добавлять или убирать ненужные, как это сделать удобнее - пробую закомментировать строки - считает неверно.
Можно оформить циклом с проверкой по условию:

замените начиная с 39-й строки и до самого конца всё, что там есть на:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
For /L %%T in (1,1,10) do (
  if exist "!infile%%T!" (
    2>NUL del "!outfile%%T!"
    for /F "UseBackQ delims=" %%n in ("!infile%%T!") do (
      set "Line=%%n"
      for /L %%c in (1,1,%cnt%) do call set "Line=%%Line:!what.%%c!=!repl.%%c!%%"
      echo !Line!>>"!outfile%%T!"
    )
  )
)
pause
и комментируйте, сколько захочется. Здесь ограничение в 10 индексов для файлов. Можете выставить верхний потолок по-больше.

P.S. Изначальный код очень ненадёжен. Возможны коллизии при большом кол-ве слов в словаре замен.
Лучше переписать на другой язык.
1
5 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 16
18.11.2016, 01:49
Dragokas, здорово у Вас выходит! Спасибо.
Благодаря этой строчке
Windows Batch file
if not exist "%Replaces%" exit /b
не создается следующий комплект.
Но в переменных
Windows Batch file
:: Файлы, в котором будет хранится предыдущее состояние
set t="%~f1"$
set t1="%~f1"$$
на 1 единичку все равно увеличивается цифра, а должна как бы замереть.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
18.11.2016, 02:28
Ну тогда переместите эти две строки:

Windows Batch file
1
2
Set Replaces=Glava%n%_info.txt
if not exist "%Replaces%" exit /b
между 11-12.
1
5 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 16
18.11.2016, 15:46
Dragokas, Спасибо Вам огромное.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2016, 15:46
Помогаю со студенческими работами здесь

Копирование строк одного файла в соответствующие списку подстроки другого файла
Здравствуйте. Есть file.txt, имеющий форму: 1 US 11.11.11.11:80 2 US 22.22.22.22:80 3 US 33.33.33.33:80 ...и т.д. Из него...

Нужно заменить строку в файле text.txt словами из другого файла words.txt
Допустим в файле words.txt есть какие-то слова ,например : #один,#два,#три. И есть файл text.txt,где есть слова: один,два,три,четыре,пять...

Разработать программу «Синонимы», которая позволяла бы по возможности заменить в файле f1 слова их синонимами из файла f2
народ кто может помочь????Даны 2 текстовых файла f1 и f2. Файл f1 содержит произвольный текст. Слова в тексте разделены пробелами и знаками...

Найти в файле F1 все заменяемые слова и заменить их на соответствующие заменяющие слова
1.Задан типизированный файл с целочисленными компонентами и произвольное целое число b. Если для i-ой компоненты файла имеет место...

Слова одного предложения заменить на совпадающие с ними по длине слова из другого предложения
Даны два предложения, состоящие не менее чем из 5 слов. Слова каждого предложения заменить на совпадающие с ними по длине...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru