Board logo

标题: [文本处理] 批处理怎样定时写入一行到第一行并删除最后一行? [打印本页]

作者: w1983912    时间: 2011-3-21 03:39     标题: 批处理怎样定时写入一行到第一行并删除最后一行?

A。TXT    B。TXT  2个文本
A内容是:
<a href="/xuexi.html">xuexi</a>&nbsp;
<a href="/xx.html">xx</a>&nbsp;


B内容是:
<a href="/1.html">1</a>&nbsp;
<a href="/2.html">2</a>&nbsp;
<a href="/3.html">3</a>&nbsp;
<a href="/4.html">4</a>&nbsp;

每隔N 秒  从B文件内    随机拿一条数据    放到 A文件的第一行  并删除A的最后一行
如取的是第3行 就得到A:
<a href="/3.html">3</a>&nbsp;
<a href="/xuexi.html">xuexi</a>&nbsp;

望知道的朋友帮忙 谢谢
作者: hanyeguxing    时间: 2011-3-21 08:05

楼主没有说明以下情况:文本的编码类型,文本内容中的敏感字符
所以以下代码按文本为ANSI编码处理,内容中不含敏感字符:
  1. @echo off&setlocal enableDelayedExpansion
  2. for /f "delims=" %%a in (B.txt) do set/a a+=1&set #!a!=%%a
  3. :A
  4. set c=&set/a b=%random%%%a+1
  5. (echo;!#%b%!
  6. for /f "delims=" %%a in (A.txt) do (
  7. if defined c echo;!c!
  8. set "c=%%a"
  9. )
  10. )>$
  11. move $ A.txt
  12. >nul ping 127.1 -n 5
  13. goto:A
复制代码
>nul ping 127.1 -n 5用来设置延迟等待时间
作者: w1983912    时间: 2011-3-21 22:25

2# hanyeguxing


很好的代码   谢谢   GBK正常   楼上的朋友考虑很周到
1.   不过,utf-8的代码 如何才能实现呢?

2.    如果在包括其他未知特殊符号的情况下呢?   GBK 和utf-8

希望能再帮我谢谢
作者: CrLf    时间: 2011-3-21 22:39

utf-8简直是个魔咒...
作者: Batcher    时间: 2011-3-21 22:57

3# w1983912


VBS版文件编码识别、转换工具(GB2312、UTF-8、Unicode、BIG5)
http://bbs.bathome.net/thread-3900-1-1.html

VBS版无BOM的UTF-8转ANSI
http://bbs.bathome.net/viewthread.php?tid=8299#pid54514
作者: CrLf    时间: 2011-3-21 23:00

batcher真敬业啊,整天都在论坛,不歇息的
作者: acaigg    时间: 2011-3-31 15:29

能解释一下二楼代码中删除A文件最后一行的处理机制吗?谢谢!
作者: CrLf    时间: 2011-3-31 15:35

没有删除,经常用“move 临时文件 目标文件”来达到“del 目标文件&ren 临时文件 目标文件”的效果,省时省力效果好。
作者: acaigg    时间: 2011-3-31 15:47

没有删除,经常用“move 临时文件 目标文件”来达到“del 目标文件&ren 临时文件 目标文件”的效果,省时省力效果好。
zm900612 发表于 2011-3-31 15:35

回楼上的:
但是它在写入$这个文件时就己经是少了一行了,这是如何做到的?(我测试时有打开$这个文件看过)
作者: CrLf    时间: 2011-3-31 15:55

哦,我会错意了...
他是先输出变量c,把整行内容都设为变量c,这样变量c始终是上一行的内容:
        if defined c echo;!c!
        set "c=%%a"
作者: acaigg    时间: 2011-3-31 16:05

哦,谢谢zm900612的耐心解答,但我貌似还不大明手白。
还有小声说一句,能不能换个头像?呵呵......
作者: CrLf    时间: 2011-3-31 16:11

其实那段代码有bug,没考虑空行...不过可以给c变量的内容加个前缀,再用变量偏移简单解决
这头像真的那么恶心吗...好吧,那我换个吧
作者: acaigg    时间: 2011-3-31 16:24

哦,了解。空行和特殊字符都可以处理吗?如果zm900612兄方便又有空的话,能否就修改一下,重新搞个代码?谢谢!
作者: CrLf    时间: 2011-3-31 16:40

本帖最后由 zm900612 于 2011-3-31 17:17 编辑

其实不需要伤筋动骨,只是一个忽略A.txt空行的小bug,修正一下就好:
  1. @echo off&setlocal enableDelayedExpansion
  2. for /f "delims=" %%a in (B.txt) do set/a a+=1&set #!a!=@%%a
  3. :A
  4. set c=&set/a b=%random%%%a+1
  5. (echo;!#%b%:~1!
  6. for /f "delims=" %%a in (A.txt) do (
  7.         if defined c echo;!c:~1!
  8.         set "c=@%%a"
  9. )
  10. )>$
  11. move $ A.txt
  12. >nul ping 127.1 -n 5
  13. goto:A
复制代码
特殊字符的问题没什么好办法,因为%%a的预处理是在变量延迟之前的,所以如果%%a的值中含!会出错,要避免这个bug需要以严重降低效率为代价,所以将就吧。
作者: acaigg    时间: 2011-3-31 16:46

非常感谢!......
作者: acaigg    时间: 2011-3-31 17:08

呵呵,我测试了一下,好像还是不能处理空行呀。我的是xp sp3
作者: CrLf    时间: 2011-3-31 17:17

修正了一处,却漏了另一处...已修正
作者: acaigg    时间: 2011-3-31 18:48

是否我方法不对?还是不能处理空格呀......
作者: acaigg    时间: 2011-3-31 20:47

我用下面这段代码测试了一下
  1. @echo off&setlocal enableDelayedExpansion
  2. for /f "delims=" %%a in (A.txt) do (echo A的值是:%%a
  3.         if defined c echo;C的值是:!c!
  4. pause
  5.         set "c=%%a"
  6. )
  7. echo;C的值是:!c!
  8. pause
复制代码
才知道为什么可以做到少一行的效果。但是还不能处理空格。
作者: CrLf    时间: 2011-3-31 22:41

不能排除空行是因为楼上把用于纠错的部分改没了:
...
     if defined c echo;C的值是:!c:~1!
...
        set "c=@%%a"
...
这样可以避免当%%a为空时,c变量被赋了空值
作者: CrLf    时间: 2011-3-31 22:42

不能排除空行是因为楼上把用于纠错的部分改没了:
...
     if defined c echo;C的值是:!c:~1!
...
        set "c=@%%a"
...
这样可以避免当%%a为空时,c变量被赋了空值
作者: wc726842270    时间: 2011-4-1 00:01

12# zm900612
还不如原来的呢,我想白素贞做鬼都不会放过你的。呵呵
作者: acaigg    时间: 2011-4-1 16:20

不能排除空行是因为楼上把用于纠错的部分改没了:
...
     if defined c echo;C的值是:!c:~1!
...
        set "c=@%%a"
...
这样可以避免当%%a为空时,c变量被赋了空值
zm900612 发表于 2011-3-31 22:42

这个我知道,我测试空行时是直接复制你的代码的。呵呵......




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2