Board logo

标题: [文件操作] 【已解决】BAT批处理怎样给文件排序? [打印本页]

作者: zhanglei1371    时间: 2014-6-14 07:23     标题: 【已解决】BAT批处理怎样给文件排序?

本帖最后由 zhanglei1371 于 2014-6-16 06:46 编辑

第一,文件夹里有第1.txt,第2.txt一直到第100.txt,如何输出按1-100的顺序的文件目录?
第二个问题,文件夹里的文件名为第一,第二,……第三十七……第九十九,第一百,如何按这些的顺序来最终输出文件清单?〖系统默认是按拼音排的〗,最好不用第三方,能有bat和vbs两种解决方案
作者: 522235677    时间: 2014-6-14 10:37

不太明白
您的帖子长度不符合要求。 当前长度: 9 字节 系统限制: 10 到 100000 字节
作者: zhanglei1371    时间: 2014-6-14 10:48

回复 2# 522235677


    你建立几个这样的文本试试不就知道了,dir下看看排序,是不是第一后面就是第二,第二后面就是第三?
作者: 522235677    时间: 2014-6-14 11:00

回复 3# zhanglei1371


   
第一,文件夹里有第1.txt,第2.txt一直到第100.txt,如何输出按1-100的顺序的文件目录?
文件目录?
你这是要输出文件夹名称为1-100的100个文件夹?
作者: zhanglei1371    时间: 2014-6-14 11:14     标题: 标题

回复 4# 522235677


    好吧,我再仔细描述下:第一种情况,在c盘的A文件夹中有100个文本,名称就是1.txt,2.txt一直到100,要求将文件清单包含完整路径输出到c盘的清单.txt,这里的文件清单顺序是按12345678910111213141516...的顺序,一个一行。你可能会问,用dir/a-d/b/s不就可以了?不行的,因为这样出来的顺序2会比10还要大。明白了吧?
当然,真正困难的是第二种情况,如果把阿拉伯数字变成大写的一二三四,也是100个文本,也是生成文件清单,要求顺序是汉语的从小到大的顺序,还怎么做?
其实问题的核心就是排序问题,系统默认是按照拼音来排序的,一的第一个拼音字母是y,二的第一个是e,故一不会排在第一个。所以要解决这个问题,怎么处理能够让一排在第一个,二排在第二个,依次下来。
我想,我说的够清楚了吧?
作者: 522235677    时间: 2014-6-14 11:55

http://www.educity.cn/develop/667042.html
作者: hlzj88    时间: 2014-6-14 11:56

本帖最后由 hlzj88 于 2014-6-14 12:26 编辑
  1. for /l %%i in (1,1,100) do if exist %%i.txt echo %%i.txt>>test1.txt
  2. for %%i in (  一 二 三 四 五 六 七 八 九 十) do if exist %%i.txt echo %%i.txt>>test.txt
  3. for %%i in (一 二 三 四 五 六 七 八 九) do (
  4.    for %%b in (十 十一 十二 十三 十四 十五 十六 十七 十八 十九 ) do (
  5.     if exist %%i%%b.txt echo %%i%%b.txt>>test.txt
  6.     )
  7.     )
  8. if exist 一百.txt echo 一百.txt>>test.txt
  9. pause
复制代码

作者: hlzj88    时间: 2014-6-14 12:01

有按数字命名的1到100的数字和汉字的txt,要求将这些文件以数数的顺序输出到文本里。

那你汉字的11,是一一还是一十一呢,并且其他也是按这样规律来命名的?
作者: zhanglei1371    时间: 2014-6-14 12:32

回复 8# hlzj88


    谢谢,是十一。其实,实际情况是对章节进行处理时遇到的,如第十一章,第十八章,第二十一节等。
作者: hlzj88    时间: 2014-6-14 12:57

对章节进行整理,那么说是网络文章小说的整理,这样的网页基本都是按数字来命名的,只要数字够大,用type *.txt就完全可以了 。
作者: zhanglei1371    时间: 2014-6-14 14:13

本帖最后由 zhanglei1371 于 2014-6-14 14:20 编辑

回复 10# hlzj88


    其实我是在用vba将ppt转到一个word中,而ppt的命名都是汉字第……章的形式,不先排好序的话会造成章节混乱,并非阿拉伯数字的网络小说所以才提出能否用vbs来实现,当然,用bat会绕点弯,不知您能否用vbs来解决下?多谢了
例:
第一章 实验室物品摆放·ppt
第八章 小白鼠的实验.ppt
第十一章 统计学的应用.ppt
第二十五章 载体药物.ppt
第五章 苯巴比妥类药物的分析.ppt
……
这个无法用vbs来排序的话,上面的bat可否对应修改下?
作者: apang    时间: 2014-6-14 15:52

本帖最后由 apang 于 2014-6-24 23:04 编辑

生成测试文本:
  1. @echo off & setlocal enabledelayedexpansion
  2. for %%a in (零.0 一.1 二.2 三.3 四.4 五.5 六.6 七.7 八.8 九.9) do (
  3.     set "%%~xa=%%~na"
  4. )
  5. md "Test\" 2>nul
  6. pushd "Test\"
  7. for /l %%a in (1 1 1200) do (
  8.     set "s=%%a"
  9.     if %%a geq 1000 (
  10.         call set "s=%%.!s:~,1!%%千%%.!s:~1,1!%%百%%.!s:~2,1!%%十%%.!s:~3!%%"
  11.         set "s=!s:零百零十零=!" & set "s=!s:零百零十=零!"
  12.         set "s=!s:零百=零!" & set "s=!s:零十零=!"
  13.         set "s=!s:零十=零!" & set "s=!s:十零=十!"
  14.     ) else if %%a geq 100 (
  15.         call set "s=%%.!s:~,1!%%百%%.!s:~1,1!%%十%%.!s:~2!%%"
  16.         set "s=!s:零十零=!"
  17.         set "s=!s:零十=零!" & set "s=!s:十零=十!"
  18.     ) else if %%a geq 10 (
  19.         call set "s=%%.!s:~,1!%%十%%.!s:~1!%%"
  20.         set "s=!s:十零=十!"
  21.     ) else set "s=!.%%a!"
  22.     echo,%%a>"第!s!章.txt"
  23. )
  24. pause
复制代码
排序:
  1. @echo off
  2. %1(for /f "tokens=1*" %%a in ('"%~0" :^|sort') do echo,%%b)>List.txt
  3. %1pause & exit/b
  4. setlocal enabledelayedexpansion
  5. for /f "delims=" %%a in ('dir /b "Test\第*章*.txt"') do (
  6.     for /f "delims=第章" %%b in ("%%~na") do set "s=%%b"
  7.     for %%b in (八 九) do set "s=!s:零%%b=%%b!"
  8.     if "!s:~,1!" == "十" set "s=一!s!"
  9.     set "s=!s:千=*1000+!"
  10.     set "s=!s:百=*100+!"
  11.     set "s=!s:十=*10+!"
  12.     for %%b in (0.零 1.一 2.二 3.三 4.四 5.五 6.六 7.七 8.八 9.九) do (
  13.         for /f "delims=." %%c in ("%%~xb") do set "s=!s:%%c=%%~nb!"
  14.     )
  15.     set /a s=!s!+0
  16.     set "s=0000!s!"
  17.     echo,!s:~-5! %%a
  18. )
复制代码
今天刚发现,估计是用for获取文件名和扩展名的办法引发了文件搜索,速度要比下面慢不少:
  1. @echo off
  2. %1(for /f "tokens=1*" %%a in ('"%~0" :^|sort') do echo,%%b)>List.txt
  3. %1pause & exit/b
  4. set "str=零一二三四五六七八九"
  5. setlocal enabledelayedexpansion
  6. for /f "delims=" %%a in ('dir /b "Test\第*章*.txt"') do (
  7.     for /f "delims=第章" %%b in ("%%~na") do set "s=%%b"
  8.     for %%b in (八 九) do set "s=!s:零%%b=%%b!"
  9.     if "!s:~,1!" == "十" set "s=一!s!"
  10.     set "s=!s:千=*1000+!"
  11.     set "s=!s:百=*100+!"
  12.     set "s=!s:十=*10+!"
  13.     for /l %%b in (0 1 9) do (
  14.         for %%c in ("!str:~%%b,1!") do set "s=!s:%%~c=%%b!"
  15.     )
  16.     set /a s=!s!+0
  17.     set "s=0000!s!"
  18.     echo,!s:~-5! %%a
  19. )
复制代码

作者: apang    时间: 2014-6-14 19:04

本帖最后由 apang 于 2014-6-14 19:38 编辑

这样好像会快一点:
  1. @set @n=0; /* & echo off
  2. pushd "Test\"
  3. dir /b 第*章*.txt 第*节*.txt|cscript -nologo -e:jscript "%~0">"..\List.txt"
  4. pause & exit/b & rem */
  5. str = "零一二三四五六七八九十百千";
  6. txt = WScript.StdIn.ReadAll().replace(/\r\n$/, "");
  7. txt = txt.replace(/^第(.+)[章|节].*/mg,
  8.     function(s0,s1) {
  9.         s1 = s1.replace(/^十/, "一$&");
  10.         s1 = s1.replace(/./g,
  11.             function(s0){
  12.                 if (str.indexOf(s0) > 9) {
  13.                     return "*" + Math.pow(10, str.indexOf(s0)-9) + "+"
  14.                 } else return str.indexOf(s0)
  15.             }
  16.         );
  17.         return eval(s1.replace(/\+$/, "")) + " " + s0;
  18.     }
  19. );
  20. ar = txt.split("\r\n");
  21. ar.sort(function(x,y) {return x.split(" ")[0]-y.split(" ")[0]});
  22. WScript.Echo(ar.join("\r\n").replace(/^\d+ /mg, ""))
复制代码

作者: zhanglei1371    时间: 2014-6-14 20:19

回复 13# apang


    太强大了,非常佩服apang大师的水平!不知可否用vbs的代码来实现,这样我就能直接用于vba代码中了
作者: apang    时间: 2014-6-15 14:12

本帖最后由 apang 于 2014-6-18 11:29 编辑

回复 14# zhanglei1371
  1. Dim strCase, fso, f, str, n, ar, re, m
  2. strCase = "零一二三四五六七八九十百千"
  3. Set fso = CreateObject("Scripting.FileSystemObject")
  4. For Each f in fso.GetFolder("Test").Files
  5.     If LCase(Right(f, 4)) = ".txt" Then str = str & f.Name & vbCrLf
  6. Next
  7. n = 0 : ReDim ar(n)
  8. Set re = New RegExp
  9. re.Pattern = "^第([" & strCase & "]+)[章节].*?\n"
  10. re.Global = True
  11. re.MultiLine = True
  12. For Each m in re.Execute(str)
  13.     ReDim PreServe ar(n)
  14.     ar(n) = ConvertCase(m.SubMatches(0)) & " " & m
  15.     n = n + 1
  16. Next
  17. call qSort(0, UBound(ar))
  18. fso.CreateTextFile("List.txt", true).Write RegEx(Join(ar, ""))
  19. MsgBox "OK"
  20. ''大写数字转成小写数字
  21. Function ConvertCase(s)
  22.     Dim i, s1, ss
  23.     If Left(s, 1) = "十" Then s = "一" & s
  24.     ''首位“十”改成“一十”
  25.     For i = 1 to Len(s)
  26.         s1 = Mid(s, i, 1)
  27.         ''循环截取变量s值的第i位,赋值给s1
  28.         If InStr(strCase, s1) > 10 Then
  29.         ''变量s1值位于strCase值的第10位以上(十百千),改成形如 *10^2+
  30.             ss = ss & "*10^" & (InStr(strCase, s1)-10) & "+"
  31.         Else ss = ss & (InStr(strCase, s1)-1)
  32.         ''否则改成strCase值中对应的位值数
  33.         End If
  34.     Next
  35.     ConvertCase = Right("0000" & eval(ss & "+0"), 5)
  36.     ''计算并凑成5位数字
  37. End Function
  38. ''排序
  39. Sub qSort(low, high)
  40.     Dim i, j, pos, tmp
  41.     If low > high Then Exit Sub
  42.     i = low : j = high
  43.     pos = ar(low)
  44.     while i <> j
  45.         while i < j and ar(j) >= pos
  46.             j = j - 1        
  47.         wend
  48.         while i < j and ar(i) <= pos
  49.             i = i + 1
  50.         wend
  51.         tmp = ar(i) : ar(i) = ar(j) : ar(j) = tmp
  52.     wend
  53.     ar(low) = ar(i) : ar(i) = pos
  54.     qSort low, i-1
  55.     qSort i+1, high
  56. End Sub
  57. ''去掉前面的5位数字
  58. Function RegEx(s)
  59.     Dim reg
  60.     Set reg = New RegExp
  61.     reg.Pattern = "^\d+ "
  62.     reg.Global = true
  63.     reg.MultiLine = true
  64.     RegEx = reg.Replace(s, "")
  65. End Function
复制代码
改一下,代码变长了,但效率比原来要好




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