Board logo

标题: [原创]终于都解决了-显示行数&删除最后一行 [打印本页]

作者: scriptor     时间: 2007-2-26 13:02    标题: [原创]终于都解决了-显示行数&删除最后一行

对于自己提出的问题,
显示行数: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 ]
作者: slore     时间: 2007-2-26 13:15
用findstr的/n输出的可以包含空行,你再读一遍……这个你才发的时候就想到了,太费周章了……需要2次就没发,所以最后还是建议你用脚本,读一次就可以了。
作者: scriptor     时间: 2007-2-26 13:22
2楼

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

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

  Quote:
需要2次

一个是find 一个是findstr
好不。你可以讲清楚么?还有那里有问题!?
作者: scriptor     时间: 2007-2-26 13:23
那我就发一个只有一个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 ]
作者: scriptor     时间: 2007-2-26 13:26

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 ]
作者: scriptor     时间: 2007-2-26 13:37
但是若有一行全是空格构成的,就有问题了,比如:

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

怎么解决?
作者: slore     时间: 2007-2-26 13:42
唉,看着麻烦。脚本简单就用脚本写……用最适合的最有效率的代码...个人的原则。。。

硬要p处理文本有点勉强(并不是说做不到)
作者: scriptor     时间: 2007-2-26 14:01
我可不写vbs和js了
你可不可以写一个给我??
作者: slore     时间: 2007-2-26 14:24
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
作者: vkill     时间: 2007-2-26 16:52


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

处理文件还是sed awk好了
作者: slore     时间: 2007-2-27 01:32


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

处理文件还是sed awk好了

脚本也不懒的。。。而且非3方嘛
作者: scriptor     时间: 2007-2-28 02:55


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

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

你怎么老是减我的分!?
作者: namejm     时间: 2007-2-28 03:19
  我的扣分理由已经在版务记录里写得很清楚了,如果我经常对你扣分,可能的原因是:
  1、你经常把标题写得很模糊;
  2、你经常灌水。

  被我扣分的不只你一个人,很多人都挨了扳子的。如果处理有失偏颇的情况,请到 意见反馈 & 网友交流 版块发帖提出。
作者: everest79     时间: 2007-2-28 05:45


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

:D:D:D:D:D
幸甚
作者: everest79     时间: 2007-2-28 06:20

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%
我也写了个
作者: electronixtar     时间: 2007-2-28 08:56


  Quote:
Originally posted by scriptor at 2007-2-28 02:55:


你怎么老是减我的分!?

多找找自己原因啦~~
作者: scriptor     时间: 2007-9-15 12:31


  Quote:
Originally posted by scriptor at 2007-2-26 13:02:
对于自己提出的问题,
显示行数:http://www.cn-dos.net/forum/viewthread.php?tid=27919&fpage=1

删除最后一行:[url]http://www.cn-dos.net/forum/viewthread.php?ti ...

对本文的修改!
  以前写的代码没有达到应有的效果!
  因为,若最后一行是纯回车符的话,输出来的还是存在,
这个程序,在原有的基础上,稍微修改了一下,达到效果!
大家可以检验!


@echo off
setlocal EnableDelayedExpansion

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

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

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

set /a l=line-2
set /a ll=line-1
for /f "tokens=1,* delims=:" %%i in (result0.txt) do (
         rem 此处原来这里是1,2*
  set /a n+=1
  ::if  "!n!" neq "!line!" ( if not "%%j"==""  (echo %%j>>result.txt) else echo.>>result.txt)
  if !n! leq !l! ( if not "%%j"=="" (echo %%j>>result.txt) else (echo.>>result.txt))
  if !n! equ !ll! set/p a=%%j>>result.txt<nul
)
rem 删除不需要的临时文件result0.txt,只保留最后结果。
del result0.txt

完毕,!

在完善一次,应该没有错了!

[ Last edited by scriptor on 2007-9-15 at 01:26 PM ]
作者: terse     时间: 2007-9-15 13:38
这个是否简单点呢?
@echo off
cd.>test2.txt
for /f "delims=:" %%i in ('findstr /n . test.txt') do set n=%%i
set /a nm=%n%
   for /f "delims=" %%i in ('findstr /n .* test.txt') do (
        set /a mn=%%i 2>nul
        set "m=%%i"
        setlocal enabledelayedexpansion
        set "m=!m:*:=!"
if !nm! EQU !mn! goto end
echo.!m!>>test2.txt
endlocal
)
:end
pause
作者: scriptor     时间: 2007-9-15 14:19
测试了
有个问题是
不能处理含有!的行中的某些字符
比如  !#$%@
输出会把 ! 省掉,因为setlocal在起作用!
作者: scriptor     时间: 2007-9-15 14:20


  Quote:
Originally posted by terse at 2007-9-15 13:38:
这个是否简单点呢?
@echo off
cd.>test2.txt
for /f "delims=:" %%i in ('findstr /n . test.txt') do set n=%%i
set /a nm=%n%
   for /f "delims=" %%i in ('findstr /n . ...

不错a
有问题:
1: 最后一行多了一个空行!
2: 文本中间有空行时,同样不能处理好
比如:
1
2

3
....
你的代码输出是:
1
2
3
.....

最后还多了空行

[ Last edited by scriptor on 2007-9-15 at 02:23 PM ]
作者: terse     时间: 2007-9-15 14:24
我这里都好的  不知道你怎么试的 最后确实多了空行  但可以处理空行
test.txt内容如下:
@echo off
cd.>test2.txt
for /f "delims=:" %%i in ('findstr /n . test.txt') do set n=%%i
set /a nm=%n%
   for /f "delims=" %%i in ('findstr /n .* test.txt') do (
        set /a mn=%%i 2>nul
        set "m=%%i"
        setlocal enabledelayedexpansion
        set "m=!m:*:=!"

                     if !nm! EQU !mn! goto end

                       echo.!m!>>test2.txt

             endlocal
   
)
:end

pause

%^>:::<|^aue||!str!~ ! @ # $ % ^ & * ( ()  <>nul

set ok=^
!m!

!m!

!m!
!nm!
!mn!
!mn!

[ Last edited by terse on 2007-9-15 at 02:31 PM ]
作者: scriptor     时间: 2007-9-15 14:33
恩,好了
你的可以输出叹号!
我是说我的不能!!!

呵呵....
你的代码还是强啊!
但是最后一行呢?

不过还是多谢了
我的那个写得太肿了
哈哈....
作者: terse     时间: 2007-9-15 14:45


  Quote:
Originally posted by scriptor at 2007-9-15 14:33:
恩,好了
你的可以输出叹号!
我是说我的不能!!!

呵呵....
你的代码还是强啊!
但是最后一行呢?

不过还是多谢了
我的那个写得太肿了
哈哈....

以为试我上面的不行呢!领会错误!so~!