Board logo

标题: [英雄求助帖]判断插入数字序列问题 [打印本页]

作者: hbby     时间: 2007-10-21 16:23    标题: [英雄求助帖]判断插入数字序列问题
我有一包含数字的日志文件A.LOG,想通过批处理实现在产生的日志上增加数字序列

比如日志内容如下:

9/9 11:20:00.234 7cc Srv: StarWind Alcohol Edition iSCSI Target v3.2.3 (Build 20070527, Win32, Alcohol Edition)
9/9 11:20:00.234 7cc Srv: Built May 29 2007 00:57:30
9/9 11:20:00.234 7cc Srv: System CPU count: 1
9/9 11:20:00.234 7cc Srv: Unlimited number of client hosts allowed.
9/9 11:20:00.296 7cc Srv: Special build (plugins are disabled).
9/9 11:20:00.328 7cc Srv: Config file: 'StarWindLite.cfg'
9/9 11:20:01.718 7cc conf: 'LogLevel' = '1'
9/9 11:20:01.718 7cc conf: 'LogMask' = '0x8fffffff'
9/9 11:20:01.718 7cc conf: 'Port' = '3260'
9/9 11:20:01.718 7cc conf: 'Interface' = '0.0.0.0'
9/9 11:20:01.718 7cc conf: 'Login' = 'test'
9/9 11:20:01.718 7cc conf: 'Password' = '##CY9rzUYh03PK3k6DJie09g=='
9/9 11:20:01.718 7cc conf: 'MinBufferSize' = '65536'
9/9 11:20:01.718 7cc conf: 'AlignmentMask' = '0x0000'
9/9 11:20:01.718 7cc conf: 'MaxPendingRequests' = '64'
9/9 11:20:01.718 7cc conf: 'DefTargetName' = 'iqn.2003-06.com.rocketdivision.swl:$(host).$(symid)'
9/9 11:20:01.718 7cc conf: 'AllowOnlyRecordableCd' = 'no'
9/9 11:20:01.718 7cc conf: Variable 'LogLevel' is set to '1'.
9/9 11:20:01.718 7cc conf: Variable 'LogMask' is set to '0x8fffffff'.
9/9 11:20:01.718 7cc conf: Variable 'Port' is set to '3260'.
9/9 11:20:01.718 7cc conf: Variable 'Interface' is set to '0.0.0.0'.
9/9 11:20:01.718 7cc conf: Variable 'Login' is set to 'test'.
9/9 11:20:01.718 7cc conf: Variable 'Password' is set

通过批处理实现每增加一个日志前运行批处理可自己在日志上加序号,达到以下效果:

01
9/9 11:20:00.234 7cc Srv: StarWind Alcohol Edition iSCSI Target v3.2.3 (Build 20070527, Win32, Alcohol Edition)
9/9 11:20:00.234 7cc Srv: Built May 29 2007 00:57:30
9/9 11:20:00.234 7cc Srv: System CPU count: 1
9/9 11:20:00.234 7cc Srv: Unlimited number of client hosts allowed.

02
9/9 11:20:00.296 7cc Srv: Special build (plugins are disabled).
9/9 11:20:00.328 7cc Srv: Config file: 'StarWindLite.cfg'
9/9 11:20:01.718 7cc conf: 'LogLevel' = '1'
9/9 11:20:01.718 7cc conf: 'LogMask' = '0x8fffffff'
9/9 11:20:01.718 7cc conf: 'Port' = '3260'
9/9 11:20:01.718 7cc conf: 'Interface' = '0.0.0.0'

03
9/9 11:20:01.718 7cc conf: 'Login' = 'test'
9/9 11:20:01.718 7cc conf: 'Password' = '##CY9rzUYh03PK3k6DJie09g=='
9/9 11:20:01.718 7cc conf: 'MinBufferSize' = '65536'
9/9 11:20:01.718 7cc conf: 'AlignmentMask' = '0x0000'
9/9 11:20:01.718 7cc conf: 'MaxPendingRequests' = '64'

04
9/9 11:20:01.718 7cc conf: 'DefTargetName' = 'iqn.2003-06.com.rocketdivision.swl:$(host).$(symid)'
9/9 11:20:01.718 7cc conf: 'AllowOnlyRecordableCd' = 'no'
9/9 11:20:01.718 7cc conf: Variable 'LogLevel' is set to '1'.
9/9 11:20:01.718 7cc conf: Variable 'LogMask' is set to '0x8fffffff'.

05
9/9 11:20:01.718 7cc conf: Variable 'Port' is set to '3260'.
9/9 11:20:01.718 7cc conf: Variable 'Interface' is set to '0.0.0.0'.
9/9 11:20:01.718 7cc conf: Variable 'Login' is set to 'test'.
9/9 11:20:01.718 7cc conf: Variable 'Password' is set

以后自己每增加一次日志,通过批处理判断在文件中前面的序列号再追加新的序号!谢谢各位!

作者: hbby     时间: 2007-10-21 19:27
英雄高手请出招,周末已经结束了!谢谢各位!

作者: 26933062     时间: 2007-10-21 19:29
主要是没太看懂你的工作流程.

作者: hbby     时间: 2007-10-21 19:39
Originally posted by 26933062 at 2007-10-21 19:29:
主要是没太看懂你的工作流程.

又是老哥你看到了呀?
就是大比方我有个批处理如下:

@echo off
生成序列数程序>>1.txt
dir>>1.txt

以后执行这个批处理就可以追加序列好,1.txt效果如下

01
2007-03-23 下午 05:19 1,024 .rnd
2006-11-07 上午 01:15 <DIR> Documents and Settings
2006-11-07 上午 01:33 <DIR> Program Files
2006-11-07 上午 01:06 <DIR> WINDOWS

02
2007-03-23 下午 05:19 1,024 .rnd
2006-11-07 上午 01:15 <DIR> Documents and Settings
2006-11-07 上午 01:33 <DIR> Program Files
2006-11-07 上午 01:06 <DIR> WINDOWS

作者: hbby     时间: 2007-10-21 19:45
说通俗点就是写个序列号生成器,可以自动判断文本中前面已经有的序列号,然后再追加连续序列号到文本里面,希望老哥能帮忙!谢谢!

作者: 26933062     时间: 2007-10-21 19:49
问题是你每次生成序列号后又如何?
你的1.txt里的内容是从哪里来的?
每次都是在1.txt生成序列号,然后再把a.log的内容copy过来吗?我想不是吧?
你这个批处理的功能还是没说清楚啊

作者: hbby     时间: 2007-10-21 19:53
每次都是在1.txt生成序列号,然后再把a.log的内容copy过来,就是这个意思!呵呵,我的表诉能力太差了!有劳老哥!

作者: hbby     时间: 2007-10-21 21:30
我有个思路,那位大哥帮改改!?
@echo off
setlocal enabledelayedexpansion
set/a n=1
:redo
type 1.txt|find "第!n!个方案" (set/a n+=1 && goto redo)
echo 第%n%个方案>>1.txt
endlocal

作者: hbby     时间: 2007-10-21 22:05
就是达到以下效果

@echo off
if not exist %date% md %date%
setlocal enabledelayedexpansion
set/a n=1
:redo
if exist %date%\!n! (set/a n+=1 && goto redo)
cd.>%date%\%n%
echo 第%n%个方案>>%date%方案.txt
endlocal
type a.log>>%date%方案.txt

以上虽然勉强实现功能,但是由于会生成临时文件,还有如果删除临时文件此程序又重头计数,很不方便,请高手支招!谢谢!

作者: lxmxn     时间: 2007-10-21 22:47
临时文件是个方法,还可以在注册表里面新建一个值,每次来读这个注册表值也行。

作者: 26933062     时间: 2007-10-22 01:16
看你的1.txt文件有个特点:
就是只有序号这一行是单独一行的.
也就是说,除了序号的行以外,其它的行,都是"内容+空格+内容",
唯独有序号的行是"内容"后面没有空格+内容.
不知道这么说你看的明白不?

@echo off
for /f "delims=" %%a in (1.txt) do (
for /f "tokens=1* delims= " %%b in ("%%a") do (
if "%%c"=="" set var=%%b
))
if "%var:~0,1%"=="0" (set /a var=%var:~1%+1) else set /a var+=1
set num=00%var%
echo %num:~-2%>>1.txt
type a.log>>1.txt
pause

作者: 26933062     时间: 2007-10-22 01:31
还有一个办法,就是在你第一次运行的时候,先手动把下一个序号写到1.txt的最下面
以后每次就可以自动把下一个序号提前写在1.txt的最后.

我认为这个比上一个好,不容易出错些

如上1.txt内容就变成

01
2007-03-23 下午 05:19 1,024 .rnd
2006-11-07 上午 01:15 <DIR> Documents and Settings
2006-11-07 上午 01:33 <DIR> Program Files
2006-11-07 上午 01:06 <DIR> WINDOWS

02
2007-03-23 下午 05:19 1,024 .rnd
2006-11-07 上午 01:15 <DIR> Documents and Settings
2006-11-07 上午 01:33 <DIR> Program Files
2006-11-07 上午 01:06 <DIR> WINDOWS

03



@echo off
for /f "delims=" %%a in (1.txt) do set var=%%a
if "%var:~0,1%"=="0" (set /a var=%var:~1%+1) else set /a var+=1
set num=00%var%
type a.log>>1.txt
echo.>>1.txt
echo %num:~-2%>>1.txt
pause


Last edited by 26933062 on 2007-10-22 at 04:57 PM ]

作者: hbby     时间: 2007-10-22 22:22
Originally posted by 26933062 at 2007-10-22 01:31:
还有一个办法,就是在你第一次运行的时候,先手动把下一个序号写到1.txt的最下面
以后每次就可以自动把下一个序号提前写在1.txt的最后 ...

老哥,可能我没表述清楚,就是自动加序列号到文本里,并判断文本里已经有的序列号然后递增!您看看我写的那个好吗?帮我看看能怎么实现不要临时文件

作者: hbby     时间: 2007-10-22 22:27
Originally posted by lxmxn at 2007-10-21 22:47:
临时文件是个方法,还可以在注册表里面新建一个值,每次来读这个注册表值也行。

请求版主也出手襄助!不胜感激!

作者: 26933062     时间: 2007-10-22 22:37
晕死
12 楼的不是么?
你不会没有测试吧?

作者: hbby     时间: 2007-10-22 23:08
Originally posted by 26933062 at 2007-10-22 22:37:
晕死
12 楼的不是么?
你不会没有测试吧?

测试了,老哥,如果日志中含有数字内容就不行了,例如文本内容是以下这个就不行了
1 135817 C178189 16 ¥32 3 * 3 * 0 31 10 31 3 * * 0 * 10 1 出票 撤销 过期 下载
2 135935 C177784 48 ¥96 3 * * 31 * 310 * 3 31 30 31 * 10 0 1 出票 撤销 过期 下载
3 135943 C178126 16 ¥32 31 30 * 31 0 * 0 3 3 * * 0 * 10 1 出票 撤销 过期 下载
4 135989 C178199 1 ¥2 3 * 3 * * 3 0 3 3 * * 0 0 0 1 出票 撤销 过期 下载
5 135990 C178199 1 ¥2 3 * 3 * 0 3 * 3 3 * * 0 0 0 1 出票 撤销 过期 下载
6 135991 C178199 1 ¥2 3 * 3 * 0 3 0 3 3 * * 0 0 * 1 出票 撤销 过期 下载
7 135992 C178199 1 ¥2 3 * 3 3 * 3 * 3 3 * * 0 0 0 1 出票 撤销 过期 下载
8 135993 C178199 1 ¥2 3 * 3 3 * 3 0 3 3 * * 0 0 * 1 出票 撤销 过期 下载
9 135994 C178199 1 ¥2 3 * 3 3 0 3 * 3 3 * * 0 0 * 1 出票 撤销 过期 下载
10 135995 C178199 1 ¥2 3 0 3 * * 3 * 3 3 * * 0 0 0 1 出票 撤销 过期 下载

作者: 26933062     时间: 2007-10-23 01:17
如果你的工作流程是:
读取1.txt里的内容,判断序号是多少,再将他加1并写入到1.txt
然后再把a.log的内容copy到1.txt

那么12楼的方法就是可以的,不管你的a.log的内容是什么都可以.
别人给你想了办法,你就要认真看别人给你回的帖.

Last edited by 26933062 on 2007-10-23 at 01:20 AM ]