中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]终于都解决了-显示行数&删除最后一行
« [1] [2] »
作者:
标题: [原创]终于都解决了-显示行数&删除最后一行 取消高亮 | 上一主题 | 下一主题
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『楼 主』:  [原创]终于都解决了-显示行数&删除最后一行

对于自己提出的问题,
显示行数:http://www.cn-dos.net/forum/viewthread.php?tid=27919&fpage=1

删除最后一行:http://www.cn-dos.net/forum/viewthread.php?tid=27920&fpage=1
终于都解决了

@echo off
setlocal EnableDelayedExpansion

rem 删除临时文件。
if exist result*.txt del result*.txt

rem 计算行数,考虑了空行。
for /f "delims=" %%i in ('find /v /n "" test.txt') do set /a line+=1
set/a num=line-1
echo test.txt文本的行数是:!num!。
pause>nul

rem 下面是输出去除最后一行后的文本内容,不过用了几个临时文件进行转移。
for /f "tokens=1,2* delims=" %%i in ('findstr /x /n .* test.txt') do (
  set /a n+=1
  if "!n!" neq "!line!">>result0.txt echo %%i
)

for /f "tokens=1,2* delims=:" %%i in (result0.txt) do (
  set /a n+=1
  if  "!n!" neq "!line!" ( if not "%%j"==""  (echo %%j>>result.txt) else echo.>>new2.txt)
)

rem 删除不需要的临时文件result0.txt,只保留最后结果。
del result0.txt


各位可以多测试特殊字符,看看结果是不是正确。
谢谢了。
有问题请批评指正。

[ Last edited by namejm on 2007-2-27 at 02:12 PM ]

   此帖被 -2 点积分    点击查看详情   
评分人:【 namejm 分数: -2  时间:2007-2-27 01:52


2007-2-26 13:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





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

用findstr的/n输出的可以包含空行,你再读一遍……这个你才发的时候就想到了,太费周章了……需要2次就没发,所以最后还是建议你用脚本,读一次就可以了。

2007-2-26 13:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 3 楼』:  

2楼

  Quote:
用findstr的/n输出的可以包含空行,你再读一遍……

的确可以的啊,你那里不可以么?

  Quote:
需要2次

一个是find 一个是findstr
好不。你可以讲清楚么?还有那里有问题!?

2007-2-26 13:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 4 楼』:  

那我就发一个只有一个find的代码,真正只读一次:


@echo off
setlocal EnableDelayedExpansion

if exist new*.txt del new*.txt
for /f "delims=" %%i in ('find /v /n "" old.txt') do set /a line+=1
set/a num=line-1
echo 文本行数是:!num!。
pause>nul

for /f "tokens=1,2* delims=:" %%i in ('findstr /x /n .* old.txt') do (
  set /a n+=1
  if  "!n!" neq "!line!" ( if not "%%j"==""  (echo %%j>>new2.txt) else echo.>>new2.txt)
)


[ Last edited by scriptor on 2007-2-26 at 12:32 AM ]

2007-2-26 13:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 5 楼』:  


if  "!n!" neq "!line!" ( if not "%%j"==""  (echo %%j>>new2.txt) else echo.>>new2.txt)


这段代码是判断只有一个回车符号的行的,
并作处理为, 若是回车换行,就echo.
若不是,就把原文输出。

[ Last edited by scriptor on 2007-2-26 at 12:31 AM ]

2007-2-26 13:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 6 楼』:  

但是若有一行全是空格构成的,就有问题了,比如:

转换后,输出为
echo 处于关闭状态。

怎么解决?

2007-2-26 13:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





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

唉,看着麻烦。脚本简单就用脚本写……用最适合的最有效率的代码...个人的原则。。。

硬要p处理文本有点勉强(并不是说做不到)

2007-2-26 13:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 8 楼』:  

我可不写vbs和js了
你可不可以写一个给我??

2007-2-26 14:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





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

Const ForReading = 1
Const ForWriting = 2
Dim strText,strNewText,OutStr
Set objFSO = Createobject("Scripting.Filesystemobject")
Set objFile = objFSO.OpenTextFile("d:\slorelee\桌面\1.txt", ForReading)
strText = objFile.ReadAll
objFile.Close
strNewText = Split(strText,vbCrlf)
Msgbox "有" & Cstr(Ubound(strNewText)+1) & "行"

strNewText(Ubound(strNewText))=Empty

OutStr=Join(strNewText,vbCrlf)
OutStr=Mid(OutStr,1,Len(OutStr)-2)

Set objFile = objFSO.OpenTextFile("d:\slorelee\桌面\2.txt", ForWriting,True)
objFile.Write OutStr
objFile.Close

2007-2-26 14:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by scriptor at 2007-2-26 14:01:
我可不写vbs和js了
你可不可以写一个给我??

处理文件还是sed awk好了

2007-2-26 16:52
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





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



  Quote:
Originally posted by vkill at 2007-2-26 03:52:

处理文件还是sed awk好了

脚本也不懒的。。。而且非3方嘛

2007-2-27 01:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by scriptor at 2007-2-26 00:02:

─────────────────── 版务记录 ────────────────────
执行:namejm
原标题:[原创]终于都 ...

你怎么老是减我的分!?

2007-2-28 02:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 13 楼』:  

  我的扣分理由已经在版务记录里写得很清楚了,如果我经常对你扣分,可能的原因是:
  1、你经常把标题写得很模糊;
  2、你经常灌水。

  被我扣分的不只你一个人,很多人都挨了扳子的。如果处理有失偏颇的情况,请到 意见反馈 & 网友交流 版块发帖提出。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-2-28 03:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by namejm at 2007-2-27 02:19 PM:
  我的扣分理由已经在版务记录里写得很清楚了,如果我经常对你扣分,可能的原因是:
  1、你经常把标题写得很模糊;
  2、你经常灌水。 ...

:D:D:D:D:D
幸甚

2007-2-28 05:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 15 楼』:  


for /f "delims=:" %%i in ('findstr /n . readme.txt') do set /a num=%%i-1
for /f "tokens=*" %%i in ('more readme.txt +%num%') do set xxx=%%i
type readme.txt|find /v "%xxx%">readme2.txt&&echo %num%
我也写了个

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


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



论坛跳转: