中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-05 22:14
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]终于都解决了-显示行数&删除最后一行 查看 3,128 回复 22
楼 主 [原创]终于都解决了-显示行数&删除最后一行 发表于 2007-02-26 13:02 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
对于自己提出的问题,
显示行数: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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
namejm -2 2007-02-27 01:52
2 发表于 2007-02-26 13:15 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
用findstr的/n输出的可以包含空行,你再读一遍……这个你才发的时候就想到了,太费周章了……需要2次就没发,所以最后还是建议你用脚本,读一次就可以了。
3 发表于 2007-02-26 13:22 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
2楼
用findstr的/n输出的可以包含空行,你再读一遍……

的确可以的啊,你那里不可以么?
需要2次

一个是find 一个是findstr
好不。你可以讲清楚么?还有那里有问题!?
4 发表于 2007-02-26 13:23 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
那我就发一个只有一个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 ]
5 发表于 2007-02-26 13:26 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线

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 ]
6 发表于 2007-02-26 13:37 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
但是若有一行全是空格构成的,就有问题了,比如:

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

怎么解决?
7 发表于 2007-02-26 13:42 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
唉,看着麻烦。脚本简单就用脚本写……用最适合的最有效率的代码...个人的原则。。。

硬要p处理文本有点勉强(并不是说做不到)
8 发表于 2007-02-26 14:01 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
我可不写vbs和js了
你可不可以写一个给我??
9 发表于 2007-02-26 14:24 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
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
10 发表于 2007-02-26 16:52 ·  中国 宁夏 银川 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
Originally posted by scriptor at 2007-2-26 14:01:
我可不写vbs和js了
你可不可以写一个给我??

处理文件还是sed awk好了
11 发表于 2007-02-27 01:32 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
Originally posted by vkill at 2007-2-26 03:52:

处理文件还是sed awk好了


脚本也不懒的。。。而且非3方嘛
12 发表于 2007-02-28 02:55 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
Originally posted by scriptor at 2007-2-26 00:02:

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


你怎么老是减我的分!?
13 发表于 2007-02-28 03:19 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  我的扣分理由已经在版务记录里写得很清楚了,如果我经常对你扣分,可能的原因是:
  1、你经常把标题写得很模糊;
  2、你经常灌水。

  被我扣分的不只你一个人,很多人都挨了扳子的。如果处理有失偏颇的情况,请到 意见反馈 & 网友交流 版块发帖提出。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
14 发表于 2007-02-28 05:45 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
Originally posted by namejm at 2007-2-27 02:19 PM:
  我的扣分理由已经在版务记录里写得很清楚了,如果我经常对你扣分,可能的原因是:
  1、你经常把标题写得很模糊;
  2、你经常灌水。 ...

:D:D:D:D:D
幸甚
15 发表于 2007-02-28 06:20 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线

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%

我也写了个
论坛跳转: