中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何按行读取多个文本文件来实现文本的合并
« [1] [2] »
作者:
标题: 如何按行读取多个文本文件来实现文本的合并 上一主题 | 下一主题
zzhh612
中级用户




积分 278
发帖 103
注册 2006-10-21
状态 离线
『楼 主』:  如何按行读取多个文本文件来实现文本的合并

按行读取多个文本文本文件到一新的文件中(也即文本文件的合并)(要求能原样输出文件中的空行及前导和行尾空白),本人写了一个但空行被忽略了,而遇到含空格或制表符等的空白行时,则会向文件写入"echo 已经关闭"不知如何能解决这些问题?

@echo off
setlocal EnableDelayedExpansion         %=启用延迟变量=%
dir/b/o:n *.txt>filelist.tmp                 %=得到文件列表=%
type.>HBfile.txt                         %=先建立结果文件=%
for /f "usebackq delims=" %%a in ("filelist.tmp") do (         %=得到一个文件名=%
set  filename=%%a                         %=将文件名赋于变量=%
call :sub !filename!                         %=带参调用子过程=%
)
del filelist.tmp                        %=完成后删除临时文件=%
goto :eof                                %=退出=%
:sub
for /f "usebackq delims=" %%i in ("%1") do (
echo %%i>>HBfile.txt)                %=将得到的内容写入结果文件=%
echo.>>HBfile.txt                                      %=在每一个文件完成后加入一空行=%
goto :eof  %=退出子过程=%



一个专搜注册信息的链接**** Hidden to Non-Reply Visitors *****回复后可见
2008-3-29 20:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
beeny
初级用户





积分 136
发帖 49
注册 2007-1-4
状态 离线
『第 2 楼』:  

用copy HBfile.txt+newfile.txt HBfile.txt

2008-3-29 20:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 3 楼』:  问题没描述清楚:

我想:
1 可以用copy   copy a.txt +b.txt+c.txt+...........+n.txt m.txt
2   使用find       for %%i in (a,b,c,................,n) do (
                             for /f %%j "skip=2 tokens=*" in ('find /v "******" %%i.txt') do (
                                  echo %%j >>m.txt
                              )
)

[ Last edited by zw19750516 on 2008-3-29 at 08:52 PM ]



批处理之家新域名:www.bathome.net
2008-3-29 20:46
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
balinger
中级用户




积分 356
发帖 115
注册 2004-7-27
状态 离线
『第 4 楼』:  

@echo off
for /f "delims=" %%i in ('dir /s/b/a-d *.txt') do (more "%%i" >>合并.txt)
pause

2008-3-29 20:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zzhh612
中级用户




积分 278
发帖 103
注册 2006-10-21
状态 离线
『第 5 楼』:  

谢谢各位,是我把问题想复杂了,
我的本意是要建立一个文本文件合并与分割的批处理,在合并时将每个文件之间加入一个分隔标志的行,以便于在以后分割时作为标记.这个标志例如:
-----------------*.TXT-------------------
以后在分割时,先从中提取出文件名,然后将下一部分内容写入到这个文件中,从而完成分割出一个文件.这样多个文件在经过合并再分割后,能完全恢复到原来的状态.

不过这个批处理我还没有写出来....
因为分割文件似乎要难一些了?

[ Last edited by zzhh612 on 2008-3-29 at 10:37 PM ]



一个专搜注册信息的链接**** Hidden to Non-Reply Visitors *****回复后可见
2008-3-29 22:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
balinger
中级用户




积分 356
发帖 115
注册 2004-7-27
状态 离线
『第 6 楼』:  

@echo off
for /f "delims=" %%i in ('dir /s/b/a-d *.txt') do (
echo -----------------%%~nxi-------------------
more "%%i"
echo -----------------%%~nxi-------------------
)>>合并.txt

2008-3-29 22:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zzhh612
中级用户




积分 278
发帖 103
注册 2006-10-21
状态 离线
『第 7 楼』:  

谢谢balinger的代码.
你的代码符符合我的意思,分割开来我却搞不定
主要是从中提取出文件名,并在两个标记间提取出文本,这一定要按行读取了,
这又涉及到了空行和空白行的问题了



一个专搜注册信息的链接**** Hidden to Non-Reply Visitors *****回复后可见
2008-3-29 22:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 8 楼』:  

# 显示两个正则表达式之间的文本(包含)
sed -n '/Iowa/,/Montana/p'

这应该可以提取文件名之间的内容吧

2008-3-29 22:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 9 楼』:  

有一个gnu工具叫csplit可以实现复杂的文本分割
你可以找找看

2008-3-29 23:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zzhh612
中级用户




积分 278
发帖 103
注册 2006-10-21
状态 离线
『第 10 楼』:  

abcd的合并代码也不错,只是文件多时运行速度较balinger的代码要慢许多.
至于Csplit的分割工具,应用并不方便,我只是想用常用的批处理命令来
实现文件的分割,至于借助于其它第三方工具的,因为在使用上不太通行,
所以也没有去考虑了...

不知能否以通常的批处理命令或是VBSCRIPT批处理来实现分割呢?

[ Last edited by zzhh612 on 2008-3-30 at 01:19 AM ]



一个专搜注册信息的链接**** Hidden to Non-Reply Visitors *****回复后可见
2008-3-30 01:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 11 楼』:  

VBSCRIPT的字符处理能力很强。。。当然可以。。。分割

2008-3-30 01:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 12 楼』:  

用P处理特殊字符不怎么样
合并的文件:
@echo off
for /f "delims=" %%i in ('dir /s/b/a-d *.txt') do (
     echo.########%%~nxi########
     more "%%i"
)>>合并.txt
pause
分割文件:
@echo off
for /f "tokens=1,2* delims=:#" %%i in ('more "合并.txt"^|findstr /n "########.*########"') do call :lp %%i "%%j"
   for /f "tokens=1* delims=:" %%a in ('findstr /n .* "合并.txt"') do (
      if %%a gtr %n% >>%x% echo/%%b
      )     
pause
goto :eof
:lp
for /f "tokens=1,2* delims=:#" %%i in ('more "合并.txt"^|findstr /n "########.*########"') do  if %%i gtr %1 set n=%%i&goto lp1
:lp1
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "合并.txt"') do (
    if %%a gtr %1 if %%a lss %n% >>%~2 echo/%%b
    )
    set x=%~2
goto :eof


   此帖被 +2 点积分    点击查看详情   
评分人:【 hjkk123 分数: +2  时间:2008-5-17 21:43




简单!简单!再简单!
2008-3-30 03:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zzhh612
中级用户




积分 278
发帖 103
注册 2006-10-21
状态 离线
『第 13 楼』:  

Terse的代码真是不错,比较符合我的本意,我用了100个文本文件试了一下,目前还没有发现什么错误.

看来我还要向你学习了,我是有思路,没技术,哈哈..



一个专搜注册信息的链接**** Hidden to Non-Reply Visitors *****回复后可见
2008-3-30 12:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
taqiao
初级用户





积分 35
发帖 19
注册 2008-5-14
状态 离线
『第 14 楼』:  

支持

2008-5-18 11:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 15 楼』:  

find /V "" c:\*.txt

代用以下把

2008-5-18 23:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: