我有一个包含1000个名字的文本文档,每行一个。我希望能够将变量设置为等于随机选择的其中一个名称。我该怎么做?谢谢。
答案 0 :(得分:1)
一种可能的方法是计算文本文件的行数,然后动态设置for /F
loop的skip
选项并仅读取一行:
for /F %%C in ('^< ".\textfile.txt" find /C /V ""') do set /A "COUNT=%%C"
if %COUNT% LEQ 0 (set /A "NUMBER=0") else (set /A "NUMBER=%RANDOM%%%%COUNT%")
if %NUMBER% LEQ 0 (set "SKIP=") else (set "SKIP=skip=%NUMBER%")
for /F "usebackq %SKIP% delims=" %%L in (".\textfile.txt") do (
set "LINE=%%L"
goto :CONT
)
:CONT
echo(%LINE%
您可以使用input redirection:
而不是for /F
来阅读该行
for /F %%C in ('^< ".\textfile.txt" find /C /V ""') do set /A "COUNT=%%C"
if %COUNT% LEQ 0 (set /A "NUMBER=0") else (set /A "NUMBER=%RANDOM%%%%COUNT%+1")
< ".\textfile.txt" (
for /L %%I in (1,1,%NUMBER%) do (
set "LINE=" & set /P LINE=""
)
)
echo(%LINE%
答案 1 :(得分:0)
即使这不是严格按照规则进行的,因为您提供的规范没有显示任何解决问题的尝试,
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q44012305.txt"
:: detect number of entries in file
FOR /f %%a IN ('type "%filename1%"^|find /c /v ""') DO SET count=%%a
SET /a maxselect=(32767 / count) * count
:reselect
SET /a selection=%RANDOM%
IF %selection% geq %maxselect% GOTO reselect
SET /a selection=(selection %% count)+1
FOR /f "tokens=1*delims=[]" %%a IN (
'type "%filename1%"^|find /n /v ""'
) DO IF %%a==%selection% SET "selection=%%b"
ECHO %selection%
GOTO :EOF
您需要更改sourcedir
的设置以适合您的具体情况。
我使用了一个名为q44012305.txt
的文件,其中包含一些虚拟数据供我测试。
首先,使用find
计算文件中的行数。
由于随机数发生器的范围是0..32767,所以做一些maxselect
的体操(计算是机械地执行,而不是优化),以便建立RNG的最大值。例如,如果文件中有1,000行,则0..32767 mod 1000的范围产生0..767的可能性略大于768..999。通过将范围限制为0..31999,任何特定选择的几率与RNG一样线性。
在1 .. count
范围内进行适当选择后,重新读取文件,这次使用find
对括号中的每一行进行编号。由于delims
是括号,%%a
将获取行号和%%b
(因为选择了两个令牌,1
和*
以及%%b
成功提名的%%a
)将被设置为相应行上的名称。当%%a
与selection
匹配时,请将selection
设置为名称。
(这只是我在汇编语言中接管的历史 - 重新使用变量,因为它有一个合适的名称)