Board logo

标题: [文本处理] 更新:批处理把文档按要求合并,这个感觉好难!,大神们一起看看 [打印本页]

作者: WYXpclOK    时间: 2015-11-18 22:26     标题: 更新:批处理把文档按要求合并,这个感觉好难!,大神们一起看看

本帖最后由 WYXpclOK 于 2015-11-20 22:52 编辑

我的文件夹DATAS里有文档:
AA-A1-A1-01.CSV
AA-A1-A1-02.CSV
AA-A1-A1-03.CSV
BB-B1-B1-01.CSV
BB-B1-B1-02.CSV
CC-C2-C2-02.CSV
CC-C2-C2-03.CSV
DD-D4-D4-01.CSV
........
等此类CSV文档
每个文档的内容都是如下格式:
AA-A1-A1-01的内容:
AA-A1-A1-01                                                                              
AA-A1-A1-01
X,Y,COMP,B,F1-1,F1-2,F1-3,F2,F3,IR,F4,IV,W1,W2,C,W
0XXXXXXXXXXXXXXXXXXXXX
1XXXXXXXXXXXXXXXXXXXXX
2XXXXXXXXXXXXXXXXXXXXX
3XXXXXXXXXXXXXXXXXXXXX
.........
AA-A1-A1-02的内容:
AA-A1-A1-02              
AA-A1-A1-02
X,Y,COMP,B,F1-1,F1-2,F1-3,F2,F3,IR,F4,IV,W1,W2,C,W
0XXXXXXXXXXXXXXXXXXXXX
1XXXXXXXXXXXXXXXXXXXXX
2XXXXXXXXXXXXXXXXXXXXX
3XXXXXXXXXXXXXXXXXXXXX
.........
要求1:让文档按照:AA-A1-A1-01+AA-A1-A1-02+AA-A1-A1-03    BB-B1-B1-01+BB-B1-B1-02   CC-C2-C2-01+CC-C2-C2-03方式合并文档,也就是说要名字除了-01,-02,-03等的序号不一样其他的名字都要一样才可以合并.
要求2:文档合并后的文档到另一文件夹中,名字为-01序号前的名字如:(AA-A1-A1)并且内容只保留第一个文档的前三行,第二或者第三个文档的前三行不要,后面的内容接第一个文档最后一行的下一行.例如:
合并AA-A1-A1-01+AA-A1-A1-02+AA-A1-A1-03后新的文档名字为AA-A1-A1
且内容:
AA-A1-A1-01                                                                              
AA-A1-A1-01
X,Y,COMP,B,F1-1,F1-2,F1-3,F2,F3,IR,F4,IV,W1,W2,C,W
0XXXXXXXXXXXXXXXXXXXXX
1XXXXXXXXXXXXXXXXXXXXX
2XXXXXXXXXXXXXXXXXXXXX
3XXXXXXXXXXXXXXXXXXXXX
.........
0XXXXXXXXXXXXXXXXXXXXX
1XXXXXXXXXXXXXXXXXXXXX
2XXXXXXXXXXXXXXXXXXXXX
3XXXXXXXXXXXXXXXXXXXXX
.........
0XXXXXXXXXXXXXXXXXXXXX
1XXXXXXXXXXXXXXXXXXXXX
2XXXXXXXXXXXXXXXXXXXXX
3XXXXXXXXXXXXXXXXXXXXX
.........
要求3:在合并时要像附件里图片那样,如果在输入需要合并的文档名称时在DATAS文件里没有这个文档要提示“找不到此文件请确认重新输入”,如果有就继续下一步。还要循环使用;批处理可以在任何地方,不要在DATAS文件夹里,也就是说可以指定要合并文档的所在文件夹路径,和合并文档后存放的路径。

附件有更新:链接: http://pan.baidu.com/s/1jGnRo8Y 密码: 5rn1
希望大家帮我看看这个应该怎么写!!!
作者: 依山居    时间: 2015-11-18 22:33

附件传网盘。
作者: WYXpclOK    时间: 2015-11-18 22:53

回复 2# 依山居


文档你可以自己按照我的格式建几个
作者: WYXpclOK    时间: 2015-11-19 07:37     标题: 标题

回复 1# WYXpclOK 大神们帮我看看
作者: wankoilz    时间: 2015-11-19 08:23

最好传点样本用于测试
作者: 依山居    时间: 2015-11-19 16:01

这是要比懒呢,你懒我更懒。
作者: WYXpclOK    时间: 2015-11-19 20:23

附件里有样本
作者: WYXpclOK    时间: 2015-11-19 21:35

有人看了吗
作者: wankoilz    时间: 2015-11-19 22:10

本帖最后由 wankoilz 于 2015-11-19 22:12 编辑

把批处理和待处理文件放一起执行:
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p target=请输入要建立的文档:
  3. set/p first=请输入要合并的文档1:
  4. if not exist %first%.csv exit
  5. (for /f "delims=" %%a in (%first%.csv) do (
  6. set/a n+=1 & echo %%a & if !n! equ 3 goto :out
  7. ))>%target%.csv
  8. :out
  9. for /f "delims=" %%a in ('dir/b %target%-*.csv') do (
  10. more +3 %%a >>%target%.csv
  11. )
  12. pause
复制代码

作者: WYXpclOK    时间: 2015-11-20 20:41

回复 9# wankoilz


    不可以指定需要合并文档的文件夹和合并后存放文档的文件夹吗?
作者: WYXpclOK    时间: 2015-11-20 20:49

回复 9# wankoilz


    需要指定要合并的文档1和文档2乃至文档3,合并后的存放路径也要指定
作者: wankoilz    时间: 2015-11-20 21:23

多运行几次不就可以了
作者: 回家路上    时间: 2015-11-20 21:51

  1. @echo off & setlocal enabledelayedexpansion
  2. :: 要合并的文件位置
  3. set sourcePath=%~dp0DATAS
  4. :: 目的文件夹
  5. set target=%~dp0DATAS\合并后
  6. :: 确认目的文件夹存在
  7. mkdir DATAS\Target >nul
  8. for /f "tokens=1-3* delims=-" %%a in ('dir /b /a-d "%sourcePath%"^|sort') do (
  9. set file=%%a-%%b-%%c-%%d
  10. if not defined %%a-%%b-%%c (
  11. echo;--------------------------------------------------
  12. echo;合并!file!...
  13. set %%a-%%b-%%c=1&set n=0
  14. for /f "delims=" %%i in (%sourcePath%\!file!) do (
  15. set /a n+=1
  16. if !n! leq 3 echo;%%i>>"%target%\%%a-%%b-%%c.%%~xd"
  17. )
  18. ) else (
  19. echo;合并!file!
  20. more +3 "%sourcePath%\!file!">>"%target%\%%a-%%b-%%c.%%~xd"
  21. )
  22. )
  23. pause & exit /b
复制代码

作者: WYXpclOK    时间: 2015-11-20 22:24

还是请看看我的要求吧
作者: 回家路上    时间: 2015-11-20 22:43

哦,你要求的太难了,不会
作者: WYXpclOK    时间: 2015-11-20 22:51

回复 15# 回家路上


    没事,大家一起来看看
作者: WYXpclOK    时间: 2015-11-21 20:42

不要沉,顶上去
作者: 依山居    时间: 2015-11-25 00:13

http://www.bathome.net/viewthread.php?tid=38306&extra=
作者: terse    时间: 2015-11-25 11:35

  1. @echo off
  2. :st1
  3. rem 默认创建文档到当前文件夹
  4. set "ph1=%cd%\"
  5. set /p ph1=请输入创建文档的路径:(如:c:\test\datst)
  6. :st2
  7. set /p ph2=请输入你要合并的文档路径:(如:d:\test\datst)
  8. if not exist %ph2%\ echo;输入错误 & goto st2
  9. set /p new_name=请输入你要创建的文件名:
  10. set "new_name=%ph1%\%new_name%.csv"
  11. md "%ph1%" 2>nul
  12. setlocal enabledelayedexpansion
  13. :start
  14. set /a n+=1
  15. set /p filename%n%=请输入你想要合并的文档%n%:
  16. if not exist "%ph2%\!filename%n%!.csv" (
  17.    if defined filename%n% (
  18.       echo;输入错误 !filename%n%!.csv 文件不存在
  19.       set "filename%n%="
  20.       set/a n-=1
  21.       set /p f=如需重新输入文件名请输入Y 退出按回车。
  22.       if /i "!f!" neq "Y" goto end
  23.       set "f="
  24.    ) else set/a n-=1&goto end
  25. ) else (
  26.     if !n! equ 1 (
  27.        copy /b "%ph2%\!filename%n%!.csv" "%new_name%" >nul
  28.     ) else more +3 "%ph2%\!filename%n%!.csv" >> "%new_name%"
  29. )
  30. goto start
  31. :end
  32. echo;%n% 个文件合并到 "%new_name%"
  33. endlocal
  34. set /p f=继续合并新文件输入Y 退出按回车。
  35. if /i "%f%" == "y" set f=&goto st1
复制代码

作者: WYXpclOK    时间: 2015-11-29 12:19

回复 19# terse


    你这合并后文档内容是接着第一个文档的最后一行加的,我需要换行接着加的,看附件
链接: http://pan.baidu.com/s/1sjQTrjf 密码: 1bc6
作者: terse    时间: 2015-11-29 12:39

那你在代码28行下面加一行试试
  1. (for /f %%i in ('findstr /v $ "%new_name%"') do echo.)>>"%new_name%"
复制代码

作者: WYXpclOK    时间: 2015-11-30 13:43

回复 21# terse


    非常感谢,你的完全符合我的要求
作者: WYXpclOK    时间: 2015-12-3 13:03

回复 21# terse

最后结果
  1. @echo off
  2. :st1
  3. set "ph1=E:\C"
  4. set "ph2=E:\A"
  5. ::要合并的文档来源路径
  6. set /p new_name=请输入你要创建的文件名:
  7. set "new_name=%ph1%\%new_name%.csv"
  8. md "%ph1%" 2>nul
  9. setlocal enabledelayedexpansion
  10. :start
  11. set /a n+=1
  12. set /p filename%n%=请输入你想要合并的文档%n%:
  13. if not exist "%ph2%\!filename%n%!.csv" (
  14.    if defined filename%n% (
  15.       echo;输入错误 !filename%n%!.csv 文件不存在
  16.       set "filename%n%="
  17.       set/a n-=1
  18.       set /p f=如需重新输入文件名请输入Y 退出按回车。
  19.       if /i "!f!" neq "Y" goto end
  20.       set "f="
  21.    ) else set/a n-=1&goto end
  22. ) else (
  23.     if !n! equ 1 (
  24.        copy /b "%ph2%\!filename%n%!.csv" "%new_name%" >nul
  25.     ) else more +3 "%ph2%\!filename%n%!.csv" >> "%new_name%"
  26. )
  27. (for /f %%i in ('findstr /v $ "%new_name%"') do echo.)>>"%new_name%"
  28. goto start
  29. :end
  30. echo;%n% 个文件合并到 "%new_name%"
  31. endlocal
  32. set /p f=继续合并新文件输入Y 退出按回车。
  33. if /i "%f%" == "y" set f=&goto st1
复制代码
追问:如果在要合并的文档来源路径那里追加一个路径E:\B应该怎样写,就是在E:\A和E:\B里都去找一下要合并的文档
作者: terse    时间: 2015-12-3 13:57

回复 23# WYXpclOK
这样?
  1. @echo off
  2. :st1
  3. set "ph1=E:\C"
  4. set "ph2=E:\A"
  5. set "ph3=E:\B"
  6. ::要合并的文档来源路径
  7. set /p new_name=请输入你要创建的文件名:
  8. set "new_name=%ph1%\%new_name%.csv"
  9. md "%ph1%" 2>nul
  10. setlocal enabledelayedexpansion
  11. :start
  12. set /a n+=1
  13. set /p filename%n%=请输入你想要合并的文档%n%:
  14. if not exist "%ph2%\!filename%n%!.csv" (
  15.    if not exist "%ph3%\!filename%n%!.csv" (
  16.       if defined filename%n% (
  17.          echo;输入错误 !filename%n%!.csv 文件不存在
  18.          set "filename%n%="
  19.          set/a n-=1
  20.          set /p f=如需重新输入文件名请输入Y 退出按回车。
  21.          if /i "!f!" neq "Y" goto end
  22.          set "f="
  23.       ) else set/a n-=1&goto end
  24.    else (
  25.      if !n! equ 1 (
  26.         copy /b "%ph3%\!filename%n%!.csv" "%new_name%" >nul
  27.      ) else more +3 "%ph3%\!filename%n%!.csv" >> "%new_name%"
  28. ) else (
  29.     if !n! equ 1 (
  30.        copy /b "%ph2%\!filename%n%!.csv" "%new_name%" >nul
  31.     ) else more +3 "%ph2%\!filename%n%!.csv" >> "%new_name%"
  32. )
  33. (for /f %%i in ('findstr /v $ "%new_name%"') do echo.)>>"%new_name%"
  34. goto start
  35. :end
  36. echo;%n% 个文件合并到 "%new_name%"
  37. endlocal
  38. set /p f=继续合并新文件输入Y 退出按回车。
  39. if /i "%f%" == "y" set f=&goto st1
复制代码

作者: WYXpclOK    时间: 2015-12-4 08:55

回复 24# terse


    你这样写是不行的,好像要用到for命令,可是我还不会用
作者: WYXpclOK    时间: 2015-12-6 15:35

有人知道吗
作者: DAIC    时间: 2015-12-6 17:16

回复 25# WYXpclOK


    请举例说明24楼代码哪里不行




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