【问题标题】:Batch script to copy random lines from one text file to another用于将随机行从一个文本文件复制到另一个文本文件的批处理脚本
【发布时间】:2016-03-26 18:41:58
【问题描述】:

有两个文件:“list.txt”和新的“newlist.txt”。

请告诉我可以将随机行从一个文件复制到另一个文件的脚本。

复制的行数也是随机的(在指定范围内):

set min=1
set max=100
set /a numberoflines=%random%%%(max-min+1)+min

【问题讨论】:

  • 嗨! Stack Overflow 的存在是为了帮助程序员解决他们遇到的问题。这意味着你必须自己做一些事情,如果你有一个特定的问题,你不能通过谷歌搜索来解决,那么你应该在这里问。你不能只要求别人为你做你的工作。
  • 在像我这样有成千上万个问题的社区中。 stackoverflow.com/questions/15042909/…stackoverflow.com/questions/14435375/…我还是要相信有好人给我任何解决办法。
  • 该网站自 2013 年以来发生了很多的变化,曾经被认为是可接受的问题今天可能不再被视为可接受的问题。如果今天提出了其中任何一个问题,它们都会被否决。

标签: batch-file random copy lines


【解决方案1】:

虽然你没有表现出任何努力来解决这个任务,但我决定提供一个脚本,因为这对我来说听起来很有挑战性;所以这里是应该做你想做的代码:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "MIN=1"   & rem // minimum number of lines to copy
set "MAX=100" & rem // maximum number of lines to copy
set "NODUPS=" & rem /* set this to non-empty value to avoid duplicates */
for /F "delims=" %%C in ('^< "list.txt" find /C /V ""') do set /A "COUNT=%%C"
if defined NODUPS (
    if %COUNT% GTR %MAX% (
        set /A "NUMBER=%RANDOM%%%(MAX-MIN+1)+MIN"
    ) else if %COUNT% GEQ %MIN% (
        set /A "NUMBER=%RANDOM%%%(COUNT-MIN+1)+MIN"
    ) else set /A "NUMBER=COUNT"
) else (
    set /A "NUMBER=%RANDOM%%%(MAX-MIN+1)+MIN"
)
call :GENRAND RND_NUM %NUMBER% %COUNT% %NODUPS%
> "lines.tmp" (
    for /F "delims=" %%L in ('findstr /N /R "^" "list.txt"') do (
        setlocal DisableDelayedExpansion
        for /F "tokens=1 delims=:" %%N in ("%%L") do set /A "LIN_NUM=%%N"
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        set /A "INDEX=0"
        for %%I in (!RND_NUM!) do (
            set /A "INDEX+=1" & set "PADDED=0000!INDEX!"
            if %%I EQU !LIN_NUM! (
                echo(!PADDED:~-5!:!LINE:*:=!
            )
        )
        endlocal
        endlocal
    )
)
setlocal DisableDelayedExpansion
> "newlist.txt" (
    for /F "delims=" %%L in ('sort "lines.tmp"') do (
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        echo(!LINE:*:=!
        endlocal
    )
)
endlocal
endlocal
del /Q "lines.tmp"
exit /B

:GENRAND RND_NUM %NUMBER% %COUNT%
set "%1="
if not "%~4"=="" goto :NODUPS
for /L %%I in (1,1,%2) do (
    set /A "RND_ITEM=!RANDOM!%%%3+1"
    set "%1=!%1! !RND_ITEM!"
)
goto :HALT
:NODUPS
for /L %%I in (1,1,%3) do (
    set /A "RND_ITEM=!RANDOM!%%%3+1"
    set /A "RND[!RND_ITEM!_%%I]=%%I"
)
set /A "INDEX=0"
for /F "tokens=2 delims==" %%J in ('set RND[') do (
    set /A "INDEX+=1"
    set "%1=!%1! %%J"
    if !INDEX! GEQ %2 goto :HALT
)
:HALT
exit /B

除非您将变量 NODUPS 设置为非空值,否则随机行可能包含重复项。

【讨论】:

    【解决方案2】:

    这应该可行:

    @echo off
    setlocal EnableDelayedExpansion
    type nul >newlist.txt
    set min=1
    set max=100
    set /a numberoflines=%random%%%(max-min+1)+min
    set /a cnt=0
    for /f %%a in ('type "list.txt"^|find "" /v /c') do set /a cnt=%%a
    FOR /L %%G IN (1,1,%numberoflines%) DO (
      set /a "linenumber=!random!%%%cnt%"
      set "read=1"
      set "line=-1"
      for /F "usebackq delims=" %%i in ("list.txt") do (
        set /a "line=!line!+1
        if !line! equ !linenumber! echo %%i >>newlist.txt
      )
    )
    

    请注意,我在开头放了一个type nul &gt;newlist.txt,以便在复制之前清除 newlist.txt。如果您只想将行添加到文件中,则应将其删除。

    【讨论】:

    • 这可能会多次复制同一行,因为linenumber 可能在for /L 循环迭代中包含重复的数字...
    • 这个问题并没有说明不要多次复制行。如果文件中的行数少于要复制的最大行数,无论如何都会发生这种情况。
    • 哦,谢谢您的好先生!你帮了我很多!非常感谢你!
    • 代码的任何额外行中的重复项都可以删除,但我不能要求更多,你已经帮了我很多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多