Board logo

标题: [文本处理] [已解决]批处理怎样随机打乱文本内容? [打印本页]

作者: fanfande    时间: 2010-8-11 11:51     标题: [已解决]批处理怎样随机打乱文本内容?

本帖最后由 pcl_test 于 2016-7-8 20:10 编辑

版主,我这标题不错吧,给我加分,加红包吧!

问题是这样的:

同一文件夹内N多文本文件需要批处理处理
其中文本文件大致内容形如下格式:

aaaaaaa
bbbbbbbbb
cccccccc
dddddddd
eeeeee

原本这样的段落.用批处理随机打乱,也许会变成下面的形式

cccccccc
aaaaaaa
eeeeee
bbbbbbbbb
dddddddd

要求生成新的txt至该文件夹下的newtxt文件夹内!

在先等!
作者: a6c123    时间: 2010-8-11 12:29

  1. @echo off
  2. if not exist newtxt md newtxt
  3. for /f "delims=" %%a in ('dir /a:-d /b *.txt') do (
  4.     set file=%%a
  5.     SetLocal EnableDelayedExpansion
  6.     set /a RanNum = !random! %% 10 + 1
  7.     >"newtxt\!file!" sort /+!RanNum! "!file!"
  8.     EndLocal
  9. )
复制代码

作者: Batcher    时间: 2010-8-11 15:01

怎样打乱指定文本文件里边的行序
http://bbs.bathome.net/thread-7977-1-1.html

批处理如何最有效率的打乱变量重新排序
http://bbs.bathome.net/thread-5905-1-1.html
作者: terse    时间: 2010-8-11 16:44

随机方法 论坛很多的 ,一般用SET 较多,个人以为 SET多了还是费资源的
常用下面的处理   效率会提升吗 没测试
  1. @echo off&setlocal enabledelayedexpansion
  2. if "%1" equ "" (
  3.    md newtxt 2>nul
  4.         for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
  5.         (for /f "tokens=1* delims==" %%j in ('""%~0" "%%i"|sort"') do echo;%%k)>"newtxt\%%i"
  6. )
  7. pause&exit
  8. ) else for /f "usebackq delims=" %%i in (%1) do echo !random!!random!!random!=%%i
复制代码

作者: caruko    时间: 2010-8-11 17:20

呃,其实可以在每行前输入一个固定长度的 随机字符,可以是数字或者字母。
然后排序,去掉随机字符后输出。
作者: fanfande    时间: 2010-8-11 18:17

terse
你好,你那段测试下来好像有错误


还有,我认识你
之前的批处理论坛里面经常看到你的id !呵呵

[ 本帖最后由 fanfande 于 2010-8-11 18:24 编辑 ]
作者: 523066680    时间: 2010-8-11 20:04     标题: 回复 6楼 的帖子

=.=
还有,我认识你,上次你蹭饭没给钱……

terse那楼代码好棒~

楼上有啥错误要说出来撒,光说“有错误”会被批判的。
作者: fanfande    时间: 2010-8-13 00:32

我这里运行下来提示
此时不应该有bat  "%%i"|sort"'
这是怎么回事呢
作者: terse    时间: 2010-8-13 03:37

原帖由 fanfande 于 2010-8-13 00:32 发表
我这里运行下来提示
此时不应该有bat  "%%i"|sort"'
这是怎么回事呢

真不知怎么回事
文件名惹的祸?
这样试呢?
  1. @echo off&setlocal enabledelayedexpansion
  2. if "%1" equ "" (
  3.    md newtxt 2>nul
  4.    for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
  5.        set "str=%%i"
  6.        (for /f "tokens=1* delims==" %%j in ('%0 $^|sort') do echo;%%k)>"newtxt\%%i"
  7.    )
  8.    pause&exit
  9. ) else for /f "usebackq delims=" %%i in ("!str!") do echo !random!!random!!random!=%%i
复制代码

作者: fanfande    时间: 2010-8-13 18:26

在桌面上运行下来提示c:\document 不是内部或外部命令!

我把他复制到F盘上去运行,提示 F:\新建文件夹\新建 不是内部或外部命令

[ 本帖最后由 fanfande 于 2010-8-13 18:30 编辑 ]
作者: FOR    时间: 2010-8-13 18:40

re 4楼
if "%~1" equ ""
作者: terse    时间: 2010-8-14 01:32

原帖由 fanfande 于 2010-8-13 18:26 发表
在桌面上运行下来提示c:\document 不是内部或外部命令!

我把他复制到F盘上去运行,提示 F:\新建文件夹\新建 不是内部或外部命令

文件名 包含特殊字符不?
作者: fanfande    时间: 2010-8-15 00:01

没有特殊字符!就是通常的命名
作者: cjiabing    时间: 2011-8-30 09:27

本帖最后由 cjiabing 于 2011-8-30 19:50 编辑
  1. @echo off
  2. ::把文本中的行(段落)打乱顺序,进行随机排序。用了一个cmd代替临时文件,用了两个for编辑。变量延迟方面稍有困难。
  3. call  :sorttxt     E:\Batch\test.txt
  4. pause
  5. exit
  6. :SortTxt
  7. for /f "tokens=1*" %%i in ('cmd /v:on /c "@echo off&for /f "usebackq tokens^=*" %%a in ("%1") do (echo ^!random^! %%a)"^|sort') do echo %%j
  8. goto :eof
复制代码

作者: cjiabing    时间: 2011-8-30 19:39

回复 14# cjiabing


    大哥,手机复制粘贴的,自己没有括。
    我回来了。




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