2017-05-27 5 views
0

Ich habe ein Textdokument voller 1000 Namen, mit einem in jeder Zeile. Ich möchte in der Lage sein, eine Variable zu setzen, um einem dieser Namen zufällig zu entsprechen. Wie würde ich das ausführen? Vielen Dank.Batch Random Name Generator

+0

Was haben Sie bisher versucht, wo bist du stecken? – aschipfl

Antwort

0

Selbst wenn dies nicht streng ist nach den Regeln, da Sie eine spec zur Verfügung gestellt haben, ohne jeden Versuch zeigt, das Problem zu lösen,

@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q44.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 

Sie benötigen würden die Einstellung von sourcedir ändern anpassen deine Umstände.

verwendete ich eine Datei mit dem Namen q44.txt einige Dummy-Daten für meine Tests enthält.

Verwenden Sie zuerst find die Anzahl der Zeilen in der Datei zu zählen.

Da der Zufallszahlengenerator von 0..32767 reicht, tüfteln Sie mit maxselect (die Berechnung wird mechanisch durchgeführt, nicht optimiert), so dass ein maximaler Wert für den RNG ermittelt wird. Wenn zum Beispiel 1.000 Zeilen in der Datei vorhanden sind, hat ein Bereich von 0..32767 mod 1000 eine etwas höhere Chance, 0..767 als von 768..999 zu liefern. Durch die Begrenzung des Bereichs auf 0..31999 sind die Chancen einer bestimmten Wahl so linear wie der RNG.

Sobald eine geeignete Auswahl im Bereich 1 .. count getroffen wurde, lesen Sie die Datei erneut, diesmal mit find, um jede Zeile in Klammern zu nummerieren. Da delims die Klammern, wird %%a die Zeilennummer erwerben und %%b (seit zwei Token ausgewählt sind, 1 und * und %%b gelingt es dem nominierten %%a) wird auf den Namen auf die entsprechende Zeile eingestellt werden. Wenn %%a mit selection übereinstimmt, setzen Sie selection auf den Namen.

(Das ist nur meine Geschichte in Assembler-Sprache zu übernehmen - Wiederverwendung des Variable, da sie einen passenden Namen haben)

1

Ein möglicher Weg ist die Anzahl der Zeilen der Textdatei zu zählen, dann stellen Sie die skip Option eines for /F loop dynamisch und nur eine einzige Zeile zu lesen, nur:

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% 

Statt for /F die Zeile zu lesen, können Sie auch input redirection verwenden:

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% 
Verwandte Themen