标题: [文本处理] 批处理怎样定时写入一行到第一行并删除最后一行? [打印本页]
作者: w1983912 时间: 2011-3-21 03:39 标题: 批处理怎样定时写入一行到第一行并删除最后一行?
A。TXT B。TXT 2个文本
A内容是:
<a href="/xuexi.html">xuexi</a>
<a href="/xx.html">xx</a>
B内容是:
<a href="/1.html">1</a>
<a href="/2.html">2</a>
<a href="/3.html">3</a>
<a href="/4.html">4</a>
每隔N 秒 从B文件内 随机拿一条数据 放到 A文件的第一行 并删除A的最后一行
如取的是第3行 就得到A:
<a href="/3.html">3</a>
<a href="/xuexi.html">xuexi</a>
望知道的朋友帮忙 谢谢
作者: hanyeguxing 时间: 2011-3-21 08:05
楼主没有说明以下情况:文本的编码类型,文本内容中的敏感字符
所以以下代码按文本为ANSI编码处理,内容中不含敏感字符:- @echo off&setlocal enableDelayedExpansion
- for /f "delims=" %%a in (B.txt) do set/a a+=1&set #!a!=%%a
- :A
- set c=&set/a b=%random%%%a+1
- (echo;!#%b%!
- for /f "delims=" %%a in (A.txt) do (
- if defined c echo;!c!
- set "c=%%a"
- )
- )>$
- move $ A.txt
- >nul ping 127.1 -n 5
- 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,修正一下就好:- @echo off&setlocal enableDelayedExpansion
- for /f "delims=" %%a in (B.txt) do set/a a+=1&set #!a!=@%%a
- :A
- set c=&set/a b=%random%%%a+1
- (echo;!#%b%:~1!
- for /f "delims=" %%a in (A.txt) do (
- if defined c echo;!c:~1!
- set "c=@%%a"
- )
- )>$
- move $ A.txt
- >nul ping 127.1 -n 5
- 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
我用下面这段代码测试了一下- @echo off&setlocal enableDelayedExpansion
- for /f "delims=" %%a in (A.txt) do (echo A的值是:%%a
- if defined c echo;C的值是:!c!
- pause
- set "c=%%a"
- )
- echo;C的值是:!c!
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |