标题: [文件操作] 【已解决】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 编辑
- for /l %%i in (1,1,100) do if exist %%i.txt echo %%i.txt>>test1.txt
- for %%i in ( 一 二 三 四 五 六 七 八 九 十) do if exist %%i.txt echo %%i.txt>>test.txt
- for %%i in (一 二 三 四 五 六 七 八 九) do (
- for %%b in (十 十一 十二 十三 十四 十五 十六 十七 十八 十九 ) do (
- if exist %%i%%b.txt echo %%i%%b.txt>>test.txt
- )
- )
- if exist 一百.txt echo 一百.txt>>test.txt
- 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 编辑
生成测试文本:- @echo off & setlocal enabledelayedexpansion
- for %%a in (零.0 一.1 二.2 三.3 四.4 五.5 六.6 七.7 八.8 九.9) do (
- set "%%~xa=%%~na"
- )
- md "Test\" 2>nul
- pushd "Test\"
- for /l %%a in (1 1 1200) do (
- set "s=%%a"
- if %%a geq 1000 (
- call set "s=%%.!s:~,1!%%千%%.!s:~1,1!%%百%%.!s:~2,1!%%十%%.!s:~3!%%"
- set "s=!s:零百零十零=!" & set "s=!s:零百零十=零!"
- set "s=!s:零百=零!" & set "s=!s:零十零=!"
- set "s=!s:零十=零!" & set "s=!s:十零=十!"
- ) else if %%a geq 100 (
- call set "s=%%.!s:~,1!%%百%%.!s:~1,1!%%十%%.!s:~2!%%"
- set "s=!s:零十零=!"
- set "s=!s:零十=零!" & set "s=!s:十零=十!"
- ) else if %%a geq 10 (
- call set "s=%%.!s:~,1!%%十%%.!s:~1!%%"
- set "s=!s:十零=十!"
- ) else set "s=!.%%a!"
- echo,%%a>"第!s!章.txt"
- )
- pause
复制代码
排序:- @echo off
- %1(for /f "tokens=1*" %%a in ('"%~0" :^|sort') do echo,%%b)>List.txt
- %1pause & exit/b
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b "Test\第*章*.txt"') do (
- for /f "delims=第章" %%b in ("%%~na") do set "s=%%b"
- for %%b in (八 九) do set "s=!s:零%%b=%%b!"
- if "!s:~,1!" == "十" set "s=一!s!"
- set "s=!s:千=*1000+!"
- set "s=!s:百=*100+!"
- set "s=!s:十=*10+!"
- for %%b in (0.零 1.一 2.二 3.三 4.四 5.五 6.六 7.七 8.八 9.九) do (
- for /f "delims=." %%c in ("%%~xb") do set "s=!s:%%c=%%~nb!"
- )
- set /a s=!s!+0
- set "s=0000!s!"
- echo,!s:~-5! %%a
- )
复制代码
今天刚发现,估计是用for获取文件名和扩展名的办法引发了文件搜索,速度要比下面慢不少:- @echo off
- %1(for /f "tokens=1*" %%a in ('"%~0" :^|sort') do echo,%%b)>List.txt
- %1pause & exit/b
- set "str=零一二三四五六七八九"
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b "Test\第*章*.txt"') do (
- for /f "delims=第章" %%b in ("%%~na") do set "s=%%b"
- for %%b in (八 九) do set "s=!s:零%%b=%%b!"
- if "!s:~,1!" == "十" set "s=一!s!"
- set "s=!s:千=*1000+!"
- set "s=!s:百=*100+!"
- set "s=!s:十=*10+!"
- for /l %%b in (0 1 9) do (
- for %%c in ("!str:~%%b,1!") do set "s=!s:%%~c=%%b!"
- )
- set /a s=!s!+0
- set "s=0000!s!"
- echo,!s:~-5! %%a
- )
复制代码
作者: apang 时间: 2014-6-14 19:04
本帖最后由 apang 于 2014-6-14 19:38 编辑
这样好像会快一点:- @set @n=0; /* & echo off
- pushd "Test\"
- dir /b 第*章*.txt 第*节*.txt|cscript -nologo -e:jscript "%~0">"..\List.txt"
- pause & exit/b & rem */
-
- str = "零一二三四五六七八九十百千";
- txt = WScript.StdIn.ReadAll().replace(/\r\n$/, "");
- txt = txt.replace(/^第(.+)[章|节].*/mg,
- function(s0,s1) {
- s1 = s1.replace(/^十/, "一$&");
- s1 = s1.replace(/./g,
- function(s0){
- if (str.indexOf(s0) > 9) {
- return "*" + Math.pow(10, str.indexOf(s0)-9) + "+"
- } else return str.indexOf(s0)
- }
- );
- return eval(s1.replace(/\+$/, "")) + " " + s0;
- }
- );
- ar = txt.split("\r\n");
- ar.sort(function(x,y) {return x.split(" ")[0]-y.split(" ")[0]});
- 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 - Dim strCase, fso, f, str, n, ar, re, m
- strCase = "零一二三四五六七八九十百千"
- Set fso = CreateObject("Scripting.FileSystemObject")
- For Each f in fso.GetFolder("Test").Files
- If LCase(Right(f, 4)) = ".txt" Then str = str & f.Name & vbCrLf
- Next
-
- n = 0 : ReDim ar(n)
- Set re = New RegExp
- re.Pattern = "^第([" & strCase & "]+)[章节].*?\n"
- re.Global = True
- re.MultiLine = True
- For Each m in re.Execute(str)
- ReDim PreServe ar(n)
- ar(n) = ConvertCase(m.SubMatches(0)) & " " & m
- n = n + 1
- Next
-
- call qSort(0, UBound(ar))
- fso.CreateTextFile("List.txt", true).Write RegEx(Join(ar, ""))
-
- MsgBox "OK"
-
- ''大写数字转成小写数字
- Function ConvertCase(s)
- Dim i, s1, ss
- If Left(s, 1) = "十" Then s = "一" & s
- ''首位“十”改成“一十”
- For i = 1 to Len(s)
- s1 = Mid(s, i, 1)
- ''循环截取变量s值的第i位,赋值给s1
- If InStr(strCase, s1) > 10 Then
- ''变量s1值位于strCase值的第10位以上(十百千),改成形如 *10^2+
- ss = ss & "*10^" & (InStr(strCase, s1)-10) & "+"
- Else ss = ss & (InStr(strCase, s1)-1)
- ''否则改成strCase值中对应的位值数
- End If
- Next
- ConvertCase = Right("0000" & eval(ss & "+0"), 5)
- ''计算并凑成5位数字
- End Function
-
- ''排序
- Sub qSort(low, high)
- Dim i, j, pos, tmp
- If low > high Then Exit Sub
- i = low : j = high
- pos = ar(low)
- while i <> j
- while i < j and ar(j) >= pos
- j = j - 1
- wend
- while i < j and ar(i) <= pos
- i = i + 1
- wend
- tmp = ar(i) : ar(i) = ar(j) : ar(j) = tmp
- wend
- ar(low) = ar(i) : ar(i) = pos
- qSort low, i-1
- qSort i+1, high
- End Sub
-
- ''去掉前面的5位数字
- Function RegEx(s)
- Dim reg
- Set reg = New RegExp
- reg.Pattern = "^\d+ "
- reg.Global = true
- reg.MultiLine = true
- RegEx = reg.Replace(s, "")
- End Function
复制代码
改一下,代码变长了,但效率比原来要好
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |