标题: [文本处理] 更新:批处理把文档按要求合并,这个感觉好难!,大神们一起看看 [打印本页]
作者: 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 编辑
把批处理和待处理文件放一起执行:- @echo off&setlocal enabledelayedexpansion
- set/p target=请输入要建立的文档:
- set/p first=请输入要合并的文档1:
- if not exist %first%.csv exit
- (for /f "delims=" %%a in (%first%.csv) do (
- set/a n+=1 & echo %%a & if !n! equ 3 goto :out
- ))>%target%.csv
- :out
- for /f "delims=" %%a in ('dir/b %target%-*.csv') do (
- more +3 %%a >>%target%.csv
- )
- 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
- @echo off & setlocal enabledelayedexpansion
-
- :: 要合并的文件位置
- set sourcePath=%~dp0DATAS
- :: 目的文件夹
- set target=%~dp0DATAS\合并后
-
- :: 确认目的文件夹存在
- mkdir DATAS\Target >nul
- for /f "tokens=1-3* delims=-" %%a in ('dir /b /a-d "%sourcePath%"^|sort') do (
- set file=%%a-%%b-%%c-%%d
- if not defined %%a-%%b-%%c (
- echo;--------------------------------------------------
- echo;合并!file!...
- set %%a-%%b-%%c=1&set n=0
- for /f "delims=" %%i in (%sourcePath%\!file!) do (
- set /a n+=1
- if !n! leq 3 echo;%%i>>"%target%\%%a-%%b-%%c.%%~xd"
- )
- ) else (
- echo;合并!file!
- more +3 "%sourcePath%\!file!">>"%target%\%%a-%%b-%%c.%%~xd"
- )
- )
-
- 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
- @echo off
- :st1
- rem 默认创建文档到当前文件夹
- set "ph1=%cd%\"
- set /p ph1=请输入创建文档的路径:(如:c:\test\datst)
- :st2
- set /p ph2=请输入你要合并的文档路径:(如:d:\test\datst)
- if not exist %ph2%\ echo;输入错误 & goto st2
- set /p new_name=请输入你要创建的文件名:
- set "new_name=%ph1%\%new_name%.csv"
- md "%ph1%" 2>nul
- setlocal enabledelayedexpansion
-
- :start
- set /a n+=1
- set /p filename%n%=请输入你想要合并的文档%n%:
- if not exist "%ph2%\!filename%n%!.csv" (
- if defined filename%n% (
- echo;输入错误 !filename%n%!.csv 文件不存在
- set "filename%n%="
- set/a n-=1
- set /p f=如需重新输入文件名请输入Y 退出按回车。
- if /i "!f!" neq "Y" goto end
- set "f="
- ) else set/a n-=1&goto end
- ) else (
- if !n! equ 1 (
- copy /b "%ph2%\!filename%n%!.csv" "%new_name%" >nul
- ) else more +3 "%ph2%\!filename%n%!.csv" >> "%new_name%"
- )
-
- goto start
- :end
- echo;%n% 个文件合并到 "%new_name%"
- endlocal
- set /p f=继续合并新文件输入Y 退出按回车。
- 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行下面加一行试试- (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
最后结果- @echo off
- :st1
- set "ph1=E:\C"
- set "ph2=E:\A"
- ::要合并的文档来源路径
- set /p new_name=请输入你要创建的文件名:
- set "new_name=%ph1%\%new_name%.csv"
- md "%ph1%" 2>nul
- setlocal enabledelayedexpansion
- :start
- set /a n+=1
- set /p filename%n%=请输入你想要合并的文档%n%:
- if not exist "%ph2%\!filename%n%!.csv" (
- if defined filename%n% (
- echo;输入错误 !filename%n%!.csv 文件不存在
- set "filename%n%="
- set/a n-=1
- set /p f=如需重新输入文件名请输入Y 退出按回车。
- if /i "!f!" neq "Y" goto end
- set "f="
- ) else set/a n-=1&goto end
- ) else (
- if !n! equ 1 (
- copy /b "%ph2%\!filename%n%!.csv" "%new_name%" >nul
- ) else more +3 "%ph2%\!filename%n%!.csv" >> "%new_name%"
- )
- (for /f %%i in ('findstr /v $ "%new_name%"') do echo.)>>"%new_name%"
- goto start
- :end
- echo;%n% 个文件合并到 "%new_name%"
- endlocal
- set /p f=继续合并新文件输入Y 退出按回车。
- if /i "%f%" == "y" set f=&goto st1
复制代码
追问:如果在要合并的文档来源路径那里追加一个路径E:\B应该怎样写,就是在E:\A和E:\B里都去找一下要合并的文档
作者: terse 时间: 2015-12-3 13:57
回复 23# WYXpclOK
这样?- @echo off
- :st1
- set "ph1=E:\C"
- set "ph2=E:\A"
- set "ph3=E:\B"
- ::要合并的文档来源路径
- set /p new_name=请输入你要创建的文件名:
- set "new_name=%ph1%\%new_name%.csv"
- md "%ph1%" 2>nul
- setlocal enabledelayedexpansion
- :start
- set /a n+=1
- set /p filename%n%=请输入你想要合并的文档%n%:
- if not exist "%ph2%\!filename%n%!.csv" (
- if not exist "%ph3%\!filename%n%!.csv" (
- if defined filename%n% (
- echo;输入错误 !filename%n%!.csv 文件不存在
- set "filename%n%="
- set/a n-=1
- set /p f=如需重新输入文件名请输入Y 退出按回车。
- if /i "!f!" neq "Y" goto end
- set "f="
- ) else set/a n-=1&goto end
- else (
- if !n! equ 1 (
- copy /b "%ph3%\!filename%n%!.csv" "%new_name%" >nul
- ) else more +3 "%ph3%\!filename%n%!.csv" >> "%new_name%"
- ) else (
- if !n! equ 1 (
- copy /b "%ph2%\!filename%n%!.csv" "%new_name%" >nul
- ) else more +3 "%ph2%\!filename%n%!.csv" >> "%new_name%"
- )
- (for /f %%i in ('findstr /v $ "%new_name%"') do echo.)>>"%new_name%"
- goto start
- :end
- echo;%n% 个文件合并到 "%new_name%"
- endlocal
- set /p f=继续合并新文件输入Y 退出按回车。
- 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 |