Board logo

标题: [已结]逐行逐字阅读文本的批处理,请高手帮忙完善 [打印本页]

作者: ccwan     时间: 2006-11-19 21:44    标题: [已结]逐行逐字阅读文本的批处理,请高手帮忙完善

─────────── 版主提示 ───────────
      21楼 namejm 所写代码是完美解决方案
─────────── 版主提示 ───────────


我做了一个批处理,让它读取文本文件的内容,逐行逐字显示,但我水平太低,无法使它完全按照原文本的格式显示,请高手帮忙。谢谢!

[ Last edited by bjsh on 2007-8-10 at 08:35 AM ]
作者: ccwan     时间: 2006-11-19 22:57
自己顶一下!
作者: redtek     时间: 2006-11-19 23:23
每次读一行,但你并没有显示完一行后让它换新行的代码~:)
所以全连着显示了~:)

也就是说,你读取了一行文本内容后,
然后分解了这个变量,以便再逐字的显示在屏幕上(白底背景很漂亮~:),
但是,你如何知道你取的那一行显示完了?(知道那一行显示完了就可以再打一个换行符了)。

所以,是不是要主动的取完一行以后在这个变量的最后再加一个“标置结束“的符号以方便判断呢?
如果有一个 if 判断是否此行到了结尾,如果是打一个换行符 echo.
这样的方法在下面贴子的第8楼有示例~:)


详见: [原创]无奈何签名代码略析
http://www.cn-dos.net/forum/viewthread.php?tid=18838&fpage=1

上面贴子从读文本内容到显示特殊符号的例子都已经非常全面啦~:)

[ Last edited by redtek on 2006-11-19 at 10:27 AM ]
作者: ccwan     时间: 2006-11-19 23:26
谢谢!正是看了后,才有此想法,试着玩儿的。主要是没有完全消化吸收啊!

[ Last edited by ccwan on 2006-11-19 at 11:36 PM ]
作者: vkill     时间: 2006-11-20 07:03
呵呵~我喜欢先sed -n 1p 读取行再啄字读取
作者: lxmxn     时间: 2006-11-20 07:53

  刚下午写的,因为不支持特殊字符的读取,所以没敢发上来。看见兄弟发这帖子,才发上来,各位高手见笑了。

  把要读的文件拖放到 ReadTxt.BAT 文件上释放即可。
::_______________________ReadTxt.BAT_______________________

@echo off&setlocal ENABLEDELAYEDEXPANSION
FOR /F "DELIMS=" %%A IN ('type %1') DO (CALL;:__;"%%A")
endlocal&PAUSE&goto :EOF

::显示字符子函数————————————-
:__
        SET A="%1"
        SET B=0
        if "%A%"=="" goto end
        :BEGIN
        IF NOT "!A:~%B%,1!"=="" (
                SET/P=!A:~%B%,1!<NUL
                PING 127.1 -N 1 >NUL
                SET/A B+=1
                GOTO BEGIN
        ) else (
        :end
        echo/&echo\
        )

::_______________________ReadTxt.BAT_______________________

作者: chainliq     时间: 2006-11-20 08:07
呵呵,我倒是觉得这个挺有意思的,请问如何修个它的显示速度呢?
作者: vkill     时间: 2006-11-20 08:09
要 echo ,所以特殊字符这个不好处理
作者: redtek     时间: 2006-11-20 10:06
顶~~lxmxn兄的动画阅读很精彩,可以看小说啦~:)
作者: ccwan     时间: 2006-11-20 21:01
lxmxn兄确实厉害!佩服并感谢。
这正是我想要得效果,多谢兄的代码!
看看能不能解决特殊字符问题。

[ Last edited by ccwan on 2006-11-21 at 12:30 AM ]
作者: hxuan999     时间: 2006-11-23 07:49
看小说?真是个好主意,正好哪个高手用批处理也做个电子阅读器吧.
作者: redtek     时间: 2006-11-23 08:46
在PSP游戏机上看电子书多爽啊~:)

[ Last edited by redtek on 2006-11-22 at 10:31 PM ]
作者: scriptor     时间: 2007-1-12 12:38
好东西啊

有解决我的一个问题了
谢谢了
作者: stormback     时间: 2007-1-19 05:08
好东西
作者: liuxin31554155     时间: 2007-1-19 05:47
不错的东东~
作者: lxmxn     时间: 2007-1-19 05:56


  Quote:
Originally posted by chainliq at 2006-11-19 19:07:
呵呵,我倒是觉得这个挺有意思的,请问如何修个它的显示速度呢?


  修改它的显示速度可以更改代码中的 ping 语句,可以增加参数-n的值,也可以增加超时参数-w的值,个人而定。

作者: liuxin31554155     时间: 2007-1-19 06:14
好东西 下来测试下
作者: namejm     时间: 2007-2-3 00:03
  lxmxn『第 6 楼』的代码挺不错的,但是有以下缺憾:
  1、因为启用了变量延迟功能,所以,会把文本中的感叹号置换为空;
  2、因为普通for语句忽略以分号打头的行,所以此代码将不能提取这些行的内容;
  3、if 语句中的 :end 并不能被其他语句作为标签来调用,也就是说,其他语句中的goto end部分执行的时候会出错,并不能跳转到这里;
  4、SET A="%1" 中的引号是多余的,因为在call的时候,%1已经被强行赋予了引号,因此会导致 if "%A%"=="" goto end 一句始终得不到执行;

  在这个代码的基础上,得到如下代码:

  版本一:
@echo off
:: 把半角双引号换成空格,把等号换成〓,兼容其他特殊字符
:: 能处理以分号打头的行,但是会忽略空行
:: 能兼容unicode格式的文本
:: 每行之间空一行显示
for /f "delims= eol=" %%i in ('type %1') do (
    set "str=%%i"
    call set "str=%%str:"= %%"
    call :pickup
)
pause
goto :eof

:pickup
ping -n 1 127.1>nul
if "%str:~0,1%"=="=" set "str=〓%str:~1%"
set /p "=%str:~0,1%"<nul
set "str=%str:~1%"
if defined str goto pickup
echo.&echo.
goto :eof
  版本二:
@echo off
:: 与版本一的几点区别:
::   1、不能处理unicode文本
::   2、每行之间不再强行加上空行,并且能原样显示空行
for /f "delims= eol=" %%i in ('findstr /n .* %1') do (
    set "str=%%i"
    call set "str=%%str:"= %%"
    call set "str=%%str:*:=%%"
    call :pickup
)
echo.
pause
goto :eof

:pickup
if not defined str echo.&goto :eof
if "%str:~0,1%"=="=" set "str=〓%str:~1%"
set /p "=%str:~0,1%"<nul
ping -n 1 127.1>nul
set "str=%str:~1%"
if defined str goto pickup
echo.
goto :eof
[ Last edited by namejm on 2007-2-2 at 02:06 PM ]
作者: anqing     时间: 2007-2-3 00:20
太精彩了,lx和jm全是高人
作者: flandy     时间: 2007-5-1 23:06
顶,支持
作者: namejm     时间: 2007-5-30 11:30
  根据 [讨论]最大限度原样输出含特殊字符的指定行内容 这个帖子的讨论成果,得到如下代码,能完美解决特殊字符的原样显示问题,发出来大家测试一下:
@echo off

:: 逐行逐字阅读文本,并且原样显示文本内容
:: ① 为了显示文本的所有内容,使用了for+findstr的句式
:: ② 为了能原样显示文本,使用变量延迟并在合适的位置终止延迟
:: ③ 为了能正确显示引号和等号,在语句 set /p= !str:~0,1!<nul 中,等号后空一格,并使用退格键

for /f "delims=" %%i in ('findstr /n .* test.txt') do (
    set "str=%%i"
    setlocal enabledelayedexpansion
    set str=!str:*:=!
    call :pickup
    endlocal
)
pause
goto :eof

:pickup
ping -n 1 127.1>nul
if defined str (
    set /p= !str:~0,1!<nul
    set str=!str:~1!
    goto pickup
)
echo.
goto :eof

作者: qq43142691     时间: 2007-5-30 18:47
呵呵...个个都是牛人来D....偶也要努力学习ing
作者: moniuming     时间: 2008-1-7 15:54
退格键要怎么输入,谁能告诉我啊,谢谢!
作者: newaifi     时间: 2008-1-8 13:51
收藏了。。果然经典
作者: kaikai163     时间: 2008-1-8 14:31
听了版主的提示,直接到21楼,测试,牛人一个!
作者: flyfox1047     时间: 2008-1-30 20:14
都是高手呀!帮顶一个!
作者: yuehong     时间: 2008-3-5 17:46
都是高手呀!学习下。。。
作者: bbcn     时间: 2008-3-5 23:16
还真是不错啊!
作者: yk520     时间: 2008-3-20 22:29
可以啊
作者: AhKang     时间: 2008-3-31 07:07
高人,我等佩服得五体投地。收藏了……
作者: stance     时间: 2008-4-21 17:23
學習一下
作者: rzwwj1     时间: 2008-4-24 18:19
收藏了……