Board logo

标题: [讨论]按照指定文本格式批量建立目录 [打印本页]

作者: pooronce     时间: 2008-11-21 18:16    标题: [讨论]按照指定文本格式批量建立目录

某朋友想做一个批处理,以完成他建立复杂的目录结构的要求
目录结果按某文本记录,类似这样的:

  Quote:
01电影
0101动作片
010101国内
01010101大陆
01010102港台
010102国外
01010201欧美
01010202日韩
0102动画片
010201国内
010202国外

要按照这里面的序号来判断创建出这样的目录来:
01电影\0101动作片\010101国内\01010102港台

我熬了很久做了一个方面,列在下面。觉得肯定有很多不足的,大家有兴趣的也来一起试一试吧,希望能有更多更好的解决方案出来
SETLOCAL ENABLEDELAYEDEXPANSION

for /f %%x in (dirs.txt) do call :circle "%%x"

goto :eof

:circle

        set "line=%~1"
        set "left=!line:~0,2!"
        set "right=!line:~2!"
        set dirs=
       
        ::左边不含有数字,行错误退出
        for /f %%r in ('echo !left!^|findstr /r "^[0-9][0-9]"') do goto :goon
        goto :enext
       
        :goon
        ::右边非数字起首,顶级目录,直接创建退出
        for /f %%r in ('echo !right!^|findstr /r "^[0-9][0-9]"') do goto :deepgoon
                set "!left!=!line!"
                set "dirs=!dirs!!line!"
                ::echo "!dirs!"
                md "!dirs!"
                goto :next
        :deepgoon
       
        if not defined !left! goto :enext
        for /f %%i in ('call call echo %%%left%%%') do set "t_t=%%i"
        set "dirs=!dirs!!t_t!\"
        set t_t=
        set "left=!left!!right:~0,2!"
        set "right=!right:~2!
        goto :goon
       
       
       
        :enext
        echo 此行数据有问题,跳过
        :next

作者: tireless     时间: 2008-11-22 01:31

@echo off
setlocal EnableDelayedExpansion
for /f %%a in (dirs.txt) do (
  call :getnum %%a
)
pause & exit /b

:getnum
set n=
set str=%1
:loop
set /a n+=2
if "!str:~%n%,1!" lss "Z" goto loop
set num=!str:~,%n%!
set up=%num:~,-2%
set %num%=!%up%!\%1
md "G:!%num%!"

作者: pusofalse     时间: 2008-11-22 03:36
被这题难住了,一度卡壳,看这样对吗?
@Echo Off & Setlocal EnableDelayedExpansion
Set /a y=0
For /f "Usebackq Delims=" %%a in ("%~dp0dirs.txt") do (
       set "var=%%a" & set "_Path="
       set /a x=0 & Call :Loop
       If !x! Leq !y! (set /a c=y-x
           For /L %%i in (0 1 !c!) do set "_Path=!_Path!..\"
       )
       set /a y=x
       cd "!_Path!" >nul & Md "%%a" & cd "%%a"
)
Pause & Exit /b
:Loop
If Defined var set /a x+=1 & set "var=%var:~2%" & Goto :Loop
另外楼主的样本中有无这样格式的数据?
01020301
01020302
0102030101
0102030202
01020301与0102030101中间隔着一行。

[ Last edited by pusofalse on 2008-11-22 at 03:46 ]
作者: pooronce     时间: 2008-11-22 14:28
回ls朋友,这个不确定,当然标准的来说是挨着的,但能处理这种异常是最好了
作者: HAT     时间: 2008-11-23 01:03    标题: Re 4楼

这个排序应该难不住 pusofalse 兄,呵呵。
作者: pooronce     时间: 2008-11-23 13:41


  Quote:
Originally posted by pusofalse at 2008-11-22 03:36 AM:
被这题难住了,一度卡壳,看这样对吗?
[code]@Echo Off & Setlocal EnableDelayedExpansion
Set /a y=0
For /f "Usebackq Delims=" %%a in ("%~dp0dirs.txt") do  ...

好像不行,目录没套得住
作者: pooronce     时间: 2008-11-23 13:43


  Quote:
Originally posted by tireless at 2008-11-22 01:31 AM:
[code]@echo off
setlocal EnableDelayedExpansion
for /f %%a in (dirs.txt) do (
  call :getnum %%a
)
pause & exit /b

:getnum
set n=
set str=%1
:loop
set /a n+=2
if "!str:~%n%,1! ...

简结
set %num%=!%up%!%1\
这样就好了

不过似乎遇到有单数字打头的目录可能会有问题,但应该不会有这种目录出现,字母倒是有可能的,是否比较处用"A"好点?
作者: tireless     时间: 2008-11-23 14:03


  Quote:
不过似乎遇到有单数字打头的目录可能会有问题,但应该不会有这种目录出现,字母倒是有可能的,是否比较处用"A"好点?

恩,换成 9 好一点:

  Quote:
if "!str:~%n%,1!" leq "9" goto loop

dirs.txt 里面的内容你问下你那个朋友是否有“不同”的行...

[ Last edited by tireless on 2008-11-23 at 14:05 ]
作者: pooronce     时间: 2008-11-23 20:43
不同的行? 囧rz...  不懂
作者: tireless     时间: 2008-11-23 20:54    标题: Re 9楼

我是说,如果要增加一些判断,不如先你问下你那朋友 dirs.txt 的内容是否都是有规律的
作者: pooronce     时间: 2008-11-23 23:27
当然完美的情况下都是深度遍历出来的,不过人工维护时还是有可能出现失误的