Board logo

标题: [文本处理] 【已解决】求助随机抽取文本的批处理输出ECHO处于关闭状态 [打印本页]

作者: 盛世繁华    时间: 2023-7-9 13:14     标题: 【已解决】求助随机抽取文本的批处理输出ECHO处于关闭状态

需要用批处理程序处理一些txt文本。bat所在目录下有个文本:1.txt、2.txt、3.txt、4.txt、5.txt、6.txt、7.txt、8.txt,每个txt里有很多行文字。bat批处理循环运行100次,每次从1.txt、3.txt、5.txt中的任意2个txt文本中各随机抽取一行文字,从2.txt、4.txt、6.txt、7.txt、8.txt中的任意3个txt文本中各随机抽取一行文字,最后把将所有随机选取到的文字合并成一行输出到output.txt文本中,没循环一次合并的结果都会单独占据一行。因为是循环100次,所以运行结果就是合并100次,那么output.txt里最终得到的是100行合并后的文字。

运行代码后,output.txt里不是合并后的文字,而是100行ECHO 处于关闭状态。求解!

文件夹里的文件如下:
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
7.txt
8.txt
merge_texts.bat
output.txt

代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "files1=1.txt;3.txt;5.txt"
  4. set "files2=2.txt;4.txt;6.txt;7.txt;8.txt"
  5. set "output=output.txt"
  6. REM 清空输出文件
  7. break > "%output%"
  8. for /l %%i in (1, 1, 100) do (
  9.     set "result="
  10.     REM 随机选取2个txt,每个txt随机选取一行
  11.     for %%j in (%files1%) do (
  12.         set "file=%%j"
  13.         call :ReadRandomLine "!file!" line
  14.         set "result=!result! !line!"
  15.     )
  16.    
  17.     REM 随机选取3个txt,每个txt随机选取一行
  18.     for %%j in (%files2%) do (
  19.         set "file=%%j"
  20.         call :ReadRandomLine "!file!" line
  21.         if !errorlevel! equ 0 (
  22.             set "result=!result! !line!"
  23.         )
  24.     )
  25.    
  26.     REM 输出到文件
  27.     echo !result:~1! >> "%output%"
  28. )
  29. echo "合并完成。"
  30. pause
  31. goto :eof
  32. :ReadRandomLine
  33. setlocal
  34. set "file=%~1"
  35. set "line="
  36. for /f "usebackq skip=%random% tokens=*" %%k in ("%file%") do (
  37.     endlocal & set "line=%%k" & exit /b 0
  38. )
  39. exit /b 1
复制代码
output.txt内容如下:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
作者: dimo    时间: 2023-7-9 15:32

本帖最后由 dimo 于 2023-7-9 15:41 编辑

最后一个读取随机行的模块,那个random的数太大了,直接给文件所有行都跳过去了。
生成一个行数多一点的初始文件,就能运行了。
  1. echo off
  2. for /l %%i in (1,1,8) do ((for /l %%n in (0,1,40000) do echo %%i) >> %%i.txt)
复制代码
但是用我这八个txt运行后结果,好像跟要求也不太一样。
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8

作者: BingjianREMIX    时间: 2023-7-9 17:22

本帖最后由 BingjianREMIX 于 2023-7-9 17:23 编辑

把31行改成
  1. >> "%output%" echo !result:~1!
复制代码
试试
作者: 77七    时间: 2023-7-9 18:23

  1. @echo off
  2. set "files1=1.txt;3.txt;5.txt"
  3. set "files2=2.txt;4.txt;6.txt;7.txt;8.txt"
  4. set "output=output.txt"
  5. for /l %%l in (1,1,100) do (
  6. setlocal enabledelayedexpansion
  7. call :r1 "%files1%" 2
  8. for %%d in (!file!) do call :r2 "%%d"
  9. endlocal
  10. setlocal enabledelayedexpansion
  11. call :r1 "%files2%" 3
  12. for %%d in (!file!) do call :r2 "%%d"
  13. endlocal
  14. echo=
  15. )
  16. pause
  17. exit
  18. :r1
  19. for %%a in (%~1) do set #!random!!random!=%%a
  20. for /f "tokens=2 delims==" %%a in ('set #') do (
  21. set /a n+=1
  22. set file=!file! %%a
  23. if !n! equ %~2 exit /b
  24. )
  25. :r2
  26. setlocal enabledelayedexpansion
  27. for /f "useback delims=" %%b in ("%~1") do set _!random!=%%b
  28. for /f "tokens=1* delims==" %%b in ('set _') do (
  29. set /p=%%c <nul
  30. endlocal
  31. exit /b
  32. )
复制代码

作者: 盛世繁华    时间: 2023-7-9 23:34

回复 2# dimo 是的,输出到原有8个文本了
作者: 盛世繁华    时间: 2023-7-9 23:37

回复 3# BingjianREMIX 不行
作者: 盛世繁华    时间: 2023-7-9 23:42

回复 4# 77七 可以正确输出了




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2