[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 如何用批处理把TXT文本的内容进行无序/随机排列/打乱?

本帖最后由 pcl_test 于 2016-11-9 19:39 编辑

比如我有建一TXT文件,里面有内容:
123
234
345
567
678
789
890
如何把他们进行无序排列?用批处理实现。比如实现后的排列为
567
123
345
789
234
890
456

借用 随风 兄的代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%i in (a.txt) do set _!random:~-5!!random:~-5!=%%i
  3. for /f "tokens=2 delims==" %%i in ('set _') do echo %%i
  4. pause>nul
复制代码
注意:该文本不能太多的行

TOP

  对乱序重列文本内容,有一个比较通用的思路:先在每行数据前插入随机数,然后,再用 sort 命令重新排列数据,重列时再去掉插入的随机数即可。

  演示代码考虑了各种特殊情况:包括特殊符号、空行、以分号打头的行……,能处理的数据行数只受内存的限制,能处理的行长受 findstr 处理能力的限制(处理65535个字符长度的行绰绰有余),只是处理过程中会产生比原文件略大的临时文件:
  1. @echo off
  2. cd.>tmp.txt
  3. for /f "delims=" %%i in ('findstr /n .* test.txt') do (
  4.   set "str=%%i"
  5.     setlocal enabledelayedexpansion
  6.     set "str=!str:*:=!"
  7.     >>tmp.txt echo !random!:!str!
  8.     endlocal
  9. )
  10. cd.>result.txt
  11. for /f "delims=" %%i in ('sort tmp.txt') do (
  12.     set "str=%%i"
  13.     setlocal enabledelayedexpansion
  14.     set "str=!str:*:=!"
  15.     >>result.txt echo.!str!
  16.     endlocal
  17. )
  18. del tmp.txt
  19. start result.txt
复制代码


  再来个效率稍微高一点的:
  1. @echo off
  2. cd.>tmp.txt
  3. for /f "delims=" %%i in ('findstr /n .* test.txt') do (
  4.   set "str=%%i"
  5.     setlocal enabledelayedexpansion
  6.     set "str=!str:*:=!"
  7.     >>tmp.txt echo !random! !str!
  8.     endlocal
  9. )
  10. cd.>result.txt
  11. for /f "tokens=1*" %%i in ('sort tmp.txt') do (
  12.     set "str=%%j"
  13.     setlocal enabledelayedexpansion
  14.     >>result.txt echo.!str!
  15.     endlocal
  16. )
  17. del tmp.txt
  18. start result.txt
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

谢谢两位的帮忙!

TOP

返回列表