Board logo

标题: [文本处理] [已解决]批处理如何把文本按相应内容分类并指定规律合并? [打印本页]

作者: lateol    时间: 2013-7-2 10:55     标题: [已解决]批处理如何把文本按相应内容分类并指定规律合并?

要的 效果是 如当前ABC文件夹内有*.TXT个 文本。
按相应字符串进行分类,以下有代码产考。完美处理!
但现在想再给里面加一点特性,就是分类好后,在分类的文件夹里把同一类的TXT文本进行合并。
且判断该每一个文件名最后2个字母是否为A 或 F1 。如果是 则先分开合并,合并名为目录名如1-D10。
以下的代码 只实现的功能是 查找相应特征字符串进行分类,分类以该信息作为文件夹命名。
  1. @echo off
  2. cls
  3. for /l %%i in (1,1,3) do echo.
  4. color 1A
  5. ECHO         ┏━━━━━━━━━━━━━━━━━━━━┓
  6. ECHO          ┃                        ┃
  7. ECHO    ┏━━━━┫       当前选择:     刀具分类          ┣━━━━┓
  8. ECHO    ┃      ┃                       ┃      ┃
  9. ECHO    ┃       ┗━━━━━━━━━━━━━━━━━━━━┛      ┃
  10. echo     ┃                     ==处理说明↓==                         ┃
  11. echo.    ┃                                                            ┃
  12. ECHO    ┃    ┗━━直接按回车默认选择“==NC==”文件夹处理━━┛      ┃
  13. echo.    ┃                                                            ┃
  14. echo.    ┏------------------------------------------------------------┓
  15. echo     ┣    ★★★★★★====默认选择==NC==处理。====★★★★★★    ┫
  16. echo.    ┗------------------------------------------------------------┛
  17. echo.    ┃                                                            ┃
  18. echo.    ┣========处理后自动在==NC==文件夹内生成N+个刀类文件名========┫
  19. set /p DJFL=
  20. echo     ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  21. echo     ┃              ===正在处理...以下为刀具信息!====            ┃
  22. pushd "==NC==\"
  23. @echo off&setlocal enabledelayedexpansion
  24. for /f "tokens=1,2* delims=:" %%i in ('findstr /ic:"TOOL NAME = " /c:"(Cutter Name:" /c:"( DIA. = " /c:"(  Dia:" /c:"(Tool Name:" *.nc') do (
  25.     if "!%%i!" == "" (   
  26.        set "str="
  27.        if "%%k" == "" (
  28.           for /f "tokens=2-6 delims==,)" %%a in ("%%j") do (
  29.               if "%%c" =="" (
  30.                  set D=%%a&set "R=%%b"
  31.               ) else set D=%%c&set "R=%%e"
  32.           )
  33.        ) else for /f "tokens=1-6 delims=:) " %%a in ("%%k") do (
  34.                   if "%%d" neq "" (
  35.                       set D=%%a&set "R=%%d"
  36.                   ) else set "str=%%a"
  37.               )
  38.              if "!str!" == "" (
  39.                 for %%f in (D R) do for /f %%h in ("!%%f!") do (
  40.                     set "%%f=%%h"
  41.                     for /l %%e in (1 1 6) do (
  42.                         if "!%%f:~-1!" == "0" set "%%f=!%%f:~,-1!"
  43.                    )
  44.                         if "!%%f!" neq "0." (
  45.                            if "!%%f:~-1!" == "." set "%%f=!%%f:~,-1!"
  46.                            set "%%f=%%f!%%f!"
  47.                         ) else set "%%f="
  48.                 )
  49.                           set "str=!D!!R!"
  50.             )
  51.                       set str2=!str:~-1!
  52.      IF /I '!str2!' =='R' set str=!str:~0,-1!
  53. )
  54.                           
  55. echo                         %%i——【!str!】
  56.                            md "!str!" 2>nul
  57.                            move "%%i" "!str!" 2>nul
  58.                            set "%%i=i"
  59.     )
  60. )
  61. pause
  62. echo     ┠──────────────────────────────┨
  63. echo     ┃               ===【刀具分类模拟完成!】===                 ┃
  64. ECHO     ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  65. pause
复制代码
分好类后如下图
[attach]6529[/attach]

以D10文件夹为例
合并后 取文件名后两位如果是包含A 或F1 就先合并 名为1-D10 然后再合并剩下的 名为1-D10-G
[attach]6528[/attach]

如下图
[attach]6527[/attach]

其他所有分类文件夹一样。最后一步 把所有合并好的 TXT移至上一个目录。
附件  样本
http://pan.baidu.com/share/link? ... 23&uk=774360720
作者: xxpinqz    时间: 2013-7-2 13:49

56行至57行间插入下面代码看看:
  1. for /f "tokens=2 delims=-" %%y in ("%%~ni") do (
  2.    if not "%%y"=="A" if not "%%y"=="F1" (
  3.     type "%%i">>"1-!str!-G.txt"
  4.    ) else type "%%i">>"1-!str!.txt"
  5. )
复制代码

作者: lateol    时间: 2013-7-2 18:44

回复 2# xxpinqz


    谢谢! 但是为什么 会出现漏掉没处理的?如下图

D4R0.5
R0.3
R0.5
没能处理到。且1-D10.TXT里边只合到一个。
如D10文件夹
021X4-F1
021X4-F3
021X4A
021X4B
064X1-F5
064X15A
要求红色的也就是 包含A  F1 就合并一块,可能表达不太详细。
谢谢
作者: terse    时间: 2013-7-2 19:10

觉得应该在24行后 判断文件名是否含关键词
作者: lateol    时间: 2013-7-2 19:54

回复 4# terse


    24行 加应该行不通吧 必须要把他们正确分类 再进行分类合并。
重点就是 分类好后的文件名后 包含A  F1  R1 的分开合并一起。其余的按名称排序合并就行。
作者: terse    时间: 2013-7-2 22:05

回复 5# lateol
试下
  1. @echo off
  2. cls
  3. for /l %%i in (1,1,3) do echo.
  4. color 1A
  5. ECHO         ┏━━━━━━━━━━━━━━━━━━━━┓
  6. ECHO          ┃                        ┃
  7. ECHO    ┏━━━━┫       当前选择:     刀具分类          ┣━━━━┓
  8. ECHO    ┃      ┃                       ┃      ┃
  9. ECHO    ┃       ┗━━━━━━━━━━━━━━━━━━━━┛      ┃
  10. echo     ┃                     ==处理说明↓==                         ┃
  11. echo.    ┃                                                            ┃
  12. ECHO    ┃    ┗━━直接按回车默认选择“==NC==”文件夹处理━━┛      ┃
  13. echo.    ┃                                                            ┃
  14. echo.    ┏------------------------------------------------------------┓
  15. echo     ┣    ★★★★★★====默认选择==NC==处理。====★★★★★★    ┫
  16. echo.    ┗------------------------------------------------------------┛
  17. echo.    ┃                                                            ┃
  18. echo.    ┣========处理后自动在==NC==文件夹内生成N+个刀类文件名========┫
  19. set /p DJFL=
  20. echo     ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  21. echo     ┃              ===正在处理...以下为刀具信息!====            ┃
  22. pushd "==NC==\"
  23. @echo off&setlocal enabledelayedexpansion
  24. for /f "tokens=1,2* delims=:" %%i in ('findstr /ic:"TOOL NAME = " /c:"(Cutter Name:" /c:"( DIA. = " /c:"(  Dia:" /c:"(Tool Name:" *.nc') do (
  25.     if "!%%i!" == "" (
  26.        set "str="
  27.        if "%%k" == "" for /f "tokens=2-6 delims==,)" %%a in ("%%j") do (
  28.           if "%%c" =="" (
  29.              set D=%%a&set "R=%%b"
  30.           ) else set D=%%c&set "R=%%e"
  31.        ) else for /f "tokens=1-6 delims=:) " %%a in ("%%k") do (
  32.                    if "%%d" neq "" (
  33.                       set D=%%a&set "R=%%d"
  34.                    ) else set "str=%%a"
  35.                )
  36.                 if "!str!" == "" for %%f in (D R) do for /f %%h in ("!%%f!") do (
  37.                     set "%%f=%%h"
  38.                     for /l %%e in (1 1 6) do (
  39.                         if "!%%f:~-1!" == "0" set "%%f=!%%f:~,-1!"
  40.                     )
  41.                     if "!%%f!" neq "0." (
  42.                        if "!%%f:~-1!" == "." set "%%f=!%%f:~,-1!"
  43.                        if "!%%f!" neq "" set "%%f=%%f!%%f!"
  44.                     ) else set "%%f="
  45.                     set "str=!D!!R!"
  46.                 )
  47.                     md "!str!" 2>nul
  48.                     set "f=%%~ni"
  49.                     set "f=!f:~-2!"
  50.                     set s=-G
  51.                     for %%a in (A F1 R1) do if "!f:%%a=!" neq "!f!" set "s="
  52.                     if not exist "1-!str!!s!.txt" cd.>"1-!str!!s!.txt"
  53.                     copy "1-!str!!s!.txt"+"%%i" "1-!str!!s!.txt" >nul
  54.                     move "%%i" "!str!" 2>nul
  55.                     set "%%i=i"
  56.                     echo                         %%i——【!str!】
  57.     )
  58. )
  59. echo     ┠──────────────────────────────┨
  60. echo     ┃               ===【刀具分类模拟完成!】===                 ┃
  61. ECHO     ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  62. pause
复制代码

作者: xxpinqz    时间: 2013-7-2 22:44

本帖最后由 xxpinqz 于 2013-7-2 22:46 编辑

在MOVE之前判断应该没错的,除非有些文件没处理,另外上面的文件名称判断有误,还以为都是用-分割的
或者试试把下面的添加到代码的最后看看:
  1. set "com=dir /b/a-d %%a\*.nc^|findstr /iv ".*A\.nc .*F1\.nc .*R1\.nc""
  2. for /d %%a in (*) do (
  3.     copy /b "%%a\*A.nc"+ /b "%%a\*F1.nc"+ /b "%%a\*R1.nc" "1-%%a.txt" /y
  4.     for /f "delims=" %%b in ('%com%') do type "%%a\%%~nxb" >> "1-%%a-G.txt"
  5. )
复制代码

作者: lateol    时间: 2013-7-2 23:44

回复 6# terse


    完美运行!谢谢。不知道有些电脑 文件排序好像有问题,顺序有点乱了。不能按文件名排序.我的电脑上OK。
作者: lateol    时间: 2013-7-2 23:47

回复 7# xxpinqz


    好像如果该文件夹内不包含有A 的就处理有异常了,就只看到合成一个。
代码 学习了。呵呵
作者: xxpinqz    时间: 2013-7-3 00:03

回复 9# lateol
怪了,测了一下,还真的是一定要有含A的文件,其他的可以。
呵呵,我也不知道原因~~。还是用if判断保险点
作者: lateol    时间: 2013-7-4 23:30

本帖最后由 lateol 于 2013-7-4 23:31 编辑

回复 6# terse


    set "f=%%~ni"
                    set "f=!f:~-2!"

                    set s=-G
                    for %%a in (A F1 R1) do if "!f:%%a=!" neq "!f!" set "s="
                    if not exist "1-!str!!s!.txt" cd.>"1-!str!!s!.txt"
                    copy "1-!str!!s!.txt"+"%%i" "1-!str!!s!.txt" >nul

请问一下 红色部分 是什么意思?没能理解透谢谢!
作者: terse    时间: 2013-7-5 00:14

set "f=%%~ni" 将文件名赋值给变量F

set "f=!f:~-2!" 截取文件名后两位

cd.>"1-!str!!s!.txt" 建空文件

"1-!str!!s!.txt"+"%%i" 合并文件
作者: lateol    时间: 2013-7-5 08:55

回复 12# terse


    谢谢 明白了 。原来是查找符合 直接定向归类。。。强!
不过我觉得 如果我再添加个其他的特项不是难上加难了?




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