Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Contributor


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

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


Цитата dixxia:
У меня есть bat »
Не очень информативно. Можно понять так:
В 1.txt каждая строка - это слово длиной 5-12 символов на латинице
Рандомно выбирается строка из 1.txt (это слово 5-12 символов) и записывается в файл 2.txt
В файле out.dat слово Sample123 заменяется словом записанным в 2.txt
Для такой постановки (Ваш кусок переписал)
Код: Выделить весь код
@Echo Off
cls
	Set "File1=Z:\Box_In\1.txt"
	Set "FileOut=Z:\Box_In\2.txt"
	Set "FileRep=Z:\Box_In\out.dat"
	Set "Rep=Sample123"

	Set /A N=0
	For /f "usebackq Skip=2 tokens=1* delims=[]" %%i In (`2^>nul Find.exe /V /N "" "%File1%"`) Do Call Set R=%%Random%% &If Not "%%j"=="" Set /A N=%%i

	Set /A R=%N%*%Random%/32768
	For /f "usebackq delims=" %%i In (`2^>nul More +%R% "%File1%"`) Do (
		Set "RR=%%i"
		>"%FileOut%" (Echo %%i)
		GoTo :Cont
	)
	:Cont
	FOR /F "usebackq skip=2 tokens=1* delims=[]" %%i In (`2^>nul Find /V /N "" "%FileRep%"`) DO (
		Set Str=.%%j
		Set /A Num=100000000+%%i
		Call Set "@3@%%Num%%=%%Str:%Rep%=%RR%%%"
	)

	>"%FileRep%" (FOR /F "usebackq tokens=2 delims==" %%i In (`2^>nul Set "@3@"`) DO Echo%%i)
Pause
Exit /B
Если всё сложнее,
- в 1.txt строки с произвольными словами
- в 2.txt надо записать одну из строк из 1.txt, в которой обязательно есть хотя бы одно слово длиной 5-12 символов на латинице
- в файле out.dat слово Sample123 заменяется словом записанным в строке 2.txt, причем, если таких слов несколько, выбрать это слово случайным образом.
При этом код в CMD получается более громоздким
Код: Выделить весь код
@echo off
cls
	Set "File1=Z:\Box_In\1.txt"
	Set "FileOut=Z:\Box_In\2.txt"
	Set "FileRep=Z:\Box_In\out.dat"
	Set "Rep=Sample123"

	Set "Reg1=/C:" [A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]* ""
	Set "Reg2=/C:"[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]""
	Set "Reg3=/C:"^[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]*$""

	If Not Exist "%File1%" (Echo File not found "%File1%" &Pause &Exit /B 2)
	>"%FileOut%" cd. || (Echo "%FileOut%" &Pause &Exit /B 2)
	If Not Exist "%FileRep%" (Echo File not found "%FileRep%" &Pause &Exit /B 2)

	Set "N=0"
	FOR /F "usebackq delims=" %%i In (`More "%File1%"`) DO (
		(Echo  %%i )|>nul FINDSTR /I /R %Reg1% && (
			Set /A N+=1
			Call Set "@1@%%N%%=%%i"
		)
	)
	If %N%==0 (Echo File not correct "%File1%"! &Pause &Exit /B 2)

rem 	Set "@1@"
	Set R=%Random%
	
	Set /A K=0
	:Begin
		Set /A R=1+%N%*%Random%/32768
		Call Set "R=%%@1@%R%%%"

		Set /A M=0
 		For %%i In (%R%) Do (
			Echo %%i|FINDSTR /V /I /R %Reg2%|>nul FINDSTR /I /R %Reg3% &&(
				Set /A M+=1
				Call Set "@2@%%M%%=%%i"
			)
		)

		Set /A K+=1
		If %M%==0 (If %K% GTR 20 (Echo File not correct!! "%File1%"  &Pause &Exit /B 2))
		If %M%==0 GoTo :Begin
		
rem 		Set "@2@"
		Set /A RR=1+%M%*%Random%/32768
		Call Set "RR=%%@2@%RR%%%"
		>"%FileOut%" (Echo %R%)
rem 		Echo RR=%RR%

		FOR /F "usebackq skip=2 tokens=1* delims=[]" %%i In (`2^>nul Find /V /N "" "%FileRep%"`) DO (
			Set Str=.%%j
			Set /A Num=100000000+%%i
			Call Set "@3@%%Num%%=%%Str:%Rep%=%RR%%%"
		)

		>"%FileRep%" (FOR /F "usebackq tokens=2 delims==" %%i In (`2^>nul Set "@3@"`) DO Echo%%i)
Pause
Exit /B

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 19:02, 09-04-2022 | #2