Board logo

标题: [求助]如何从QQ2009的Info.db中将号码提取出来(已解决) [打印本页]

作者: Hanyeguxing     时间: 2009-3-2 10:29    标题: [求助]如何从QQ2009的Info.db中将号码提取出来(已解决)
上传的QQ2009信息info.db文件 http://upload.cn-dos.net/img/1348.rar

例如有如下的乱码:

涳艛?忌:J垟麳]CF K-婣硵艛?忌:鉁s?殸⑽矎?
NF 
 515187266 9TD  傢ろ
04  435853964 -TD 傘18娿
?
 5? o欙L(   } ~搁搁块€8362-406
務蠚崄u39E拞r 515187266 >TD 
ffffTA ?{-%/%//>PWf@=Oφ≌οη∠┫


要求:分行显示数字串。
1,由于QQ号码与乱码中的数字可能因为直接过滤其他字符而导致过滤后QQ号码与乱码中的数字连在一起而无法分辨,所以 个人认为应该使用替换。
2,因为乱码存在类似8362-406的数字串,所以在过滤时不能过滤掉-
3,由于该乱码中存在数字,所以少于5位的连续数字串要求被删除。
4,因为乱码存在类似8362-406的数字串,这些不是QQ号码,删除中间含有-的数字串。
5,删除重复的数字串

提取QQ号码后的示例效果如下:

435853964
515187266




Originally posted by HAT at 2009-3-4 05:37:
@echo off
echo 处理中,请稍等几分钟...
sed "s//\n/g" Info.db>%temp%\a.txt
findstr ^*$ %temp%\a.txt>%temp%\b.txt
sort %temp%\b.txt>%temp%\c.txt
type nul>%temp%\d.txt
for /f "delims=" %%a in (%temp%\c.txt) do (
findstr /x /c:"%%a" %temp%\d.txt>nul 2>nul||echo.%%a>>%temp%\d.txt
)
start %temp%\d.txt


Last edited by Hanyeguxing on 2009-6-6 at 01:52 ]

作者: yishanju     时间: 2009-3-2 19:49
真4想要玩死人不是

用FR 工具替换就一句命令

fr -ric:"" -t:"A" 1.txt

得到像下面的结果
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA515187266AAA9AAAAAAAAAAAAAAA
04AAAAAAAAAAAAAAAAAAA435853964AAAAAAAAAAAAAA18AA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA39AAAAAAAAAAAAAAAAA515187266AAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


Last edited by yishanju on 2009-3-2 at 19:52 ]

作者: yishanju     时间: 2009-3-2 19:53
改一下,空格,不替换成A

fr -ric:"" -t:"A" 1.txt

结果如下:

AAAAAAAAAAAAAAAAA  AAAAAAAAAAAAAAAAAAAAAAAA
AAAAA A
A 515187266 9AAAAA AA AAAAAA
04A A 435853964 AAAAAA AAAA18AA
AAA
A A5AAA AAAAAAA A AA A AAAAAAAAAAAAAAAA
AAAAAAA39AAAAAA 515187266 AAAAAA AA
AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


Last edited by yishanju on 2009-3-2 at 20:40 ]

作者: HAT     时间: 2009-3-2 23:10
sed -i "s//A/g" a.txt

作者: yishanju     时间: 2009-3-3 06:21
-_- 以前我也想用SED,不过后来发现处理过的文档的回车换行全变成黑方块,
恶心坏了
就没再用过SED

作者: HAT     时间: 2009-3-3 06:43    标题: Re 5楼
那是因为你没有找到合适的版本^_^

作者: yishanju     时间: 2009-3-3 06:45
给传个呗
我在GUNWIN32 上下的sed 4.15

作者: HAT     时间: 2009-3-3 08:01    标题: Re 7楼

作者: Hanyeguxing     时间: 2009-3-3 12:42
谢谢各位大大高人,俺只是想用一个批处理来完成,不借助其他工具可以吗?
这是给别人弄的。俺总不能给别人发段批处理脚本,然后再传给别人个文件吧。。。
鄙视一下自己,呵呵。
操作系统:XP SP2 或 SP3

Last edited by Hanyeguxing on 2009-3-3 at 12:46 ]

作者: yishanju     时间: 2009-3-3 13:18
打个包一起传过很难么?

作者: netbenton     时间: 2009-3-3 13:36
::处理60K以内的文件,大了搞不定,汇编语言部分由批处理com开发工具辅助写的。
::在%1指定要修改的文件
@echo off
goto :begin
a 80
push bx
push cx
mov si,100
mov di,si
lodsb
cmp al,30
jb 0090
cmp al,39
jb 0092
mov al,41
stosb
loop 0087
pop cx
pop bx
nop

t=80
g 97

w
q
q
:begin
debug %1<%~nx0

Last edited by netbenton on 2009-3-3 at 11:37 ]

作者: netbenton     时间: 2009-3-3 14:01    标题: 这样也可以
@echo off
goto :bengin
a 80
db, 53 51 BE 00 01 89 F7 AC 3C 30 72 04 3C 39 72 02 B0 41 AA E2
db, F2 59 5B 90


t=80
g 97

w
q
q
:bengin
debug %1<%~nx0

作者: Hanyeguxing     时间: 2009-3-3 14:16
Originally posted by netbenton at 2009-3-3 13:36:
::处理60K以内的文件,大了搞不定,汇编语言部分由批处理com开发工具辅助写的。
::在%1指定要修改的文件
@echo off
goto :begin
a 80
push bx
push cx
mov si,10 ...

这个要处理的文件至少170kb,350kb都很常见。

Originally posted by yishanju at 2009-3-3 13:18:
打个包一起传过很难么?


大大,给个fr工具的下载地址哈,俺就用他了,谢谢

作者: yishanju     时间: 2009-3-3 14:23
作者: Hanyeguxing     时间: 2009-3-3 14:41
Originally posted by yishanju at 2009-3-3 14:23:
fr下载地址:
http://baiy.cn/utils/fr/index.htm

现在开始学习fr和sed,呵呵

使用fr,依然残留少量的小黑块5555555555555555
楼上的大大,用QQ2009版里的info.db测试就知道了

Last edited by Hanyeguxing on 2009-3-3 at 14:59 ]

作者: yishanju     时间: 2009-3-3 15:08
我就懒得装2009了

你是怎么替换的

作者: Hanyeguxing     时间: 2009-3-3 15:33
上传的QQ2009信息info.db文件 http://upload.cn-dos.net/img/1348.rar

例如有如下的乱码:

涳艛?忌:J垟麳]CF K-婣硵艛?忌:鉁s?殸⑽矎?
NF 
 515187266 9TD  傢ろ
04  435853964 -TD 傘18娿
?
 5? o欙L(   } ~搁搁块€8362-406
務蠚崄u39E拞r 515187266 >TD 
ffffTA ?{-%/%//>PWf@=Oφ≌οη∠┫


要求:分行显示数字串。
1,由于QQ号码与乱码中的数字可能因为直接过滤其他字符而导致过滤后QQ号码与乱码中的数字连在一起而无法分辨,所以 个人认为应该使用替换。
2,因为乱码存在类似8362-406的数字串,所以在过滤时不能过滤掉-
3,由于该乱码中存在数字,所以少于5位的连续数字串要求被删除。
4,因为乱码存在类似8362-406的数字串,这些不是QQ号码,删除中间含有-的数字串。
5,删除重复的数字串

提取QQ号码后的示例效果如下:

435853964
515187266


Last edited by Hanyeguxing on 2009-3-4 at 01:16 ]

作者: yishanju     时间: 2009-3-3 15:38
批处理文件名不能存成和命令一样的名字,不能存成COPY 和FR之类的

作者: yishanju     时间: 2009-3-3 15:38
你就传一份文件上来吧

作者: Hanyeguxing     时间: 2009-3-3 18:55
感谢楼上大大的热心

作者: yishanju     时间: 2009-3-4 00:13
还是先说明你这样做的目的吧
这样做究竟是为了什么
是为了把QQ号码提取出来,还是单纯就是要QQ号码之外的字符替换掉

Last edited by yishanju on 2009-3-4 at 00:17 ]

作者: HAT     时间: 2009-3-4 00:17    标题: Re 17楼
很早之前就有10位QQ号了^_^

作者: Hanyeguxing     时间: 2009-3-4 01:17
Originally posted by yishanju at 2009-3-4 00:13:
还是先说明你这样做的目的吧
这样做究竟是为了什么
是为了把QQ号码提取出来,还是单纯就是要QQ号码之外的字符替换掉

当然是为了把QQ号码提取出来。。。
我是这样做的:
1,首先,将文件备份,使用fr替换“-”与“0-9”之外的全部字符(因为乱码的数字中间有-,所以保留,例如801056-105)为Z。
2,然后将Z合并为空格
3,接着,以空格换行。但这个命令在运行中造成部分号码丢失及错误,不知道该怎么弄才好。
4,删除空行及空格,特殊字串
5,删除重复行


@echo off&setlocal enabledelayedexpansion
copy info.db isee1.txt>nul 2>nul
fr -ric:"" -t:"Z" ISee1.txt
for /f "delims=" %%i in (ISee1.txt) do (
set han=%%i
>>ISee2.txt echo !han!
)
del ISee1.txt
fr -f:"ZZ" -t:"Z" ISee2.txt
find ISee2.txt "ZZ" && GOTO CC||fr -f:"Z" -t:" " ISee2.txt
for /f "tokens=1*" %%n in (ISee2.txt) do (
set xing=%%n
>>ISee1.txt echo !xing!
>>ISee1.txt echo !xing!
)
del ISee2.txt
for /f "delims=" %%k in (ISee1.txt) do (
set ye=%%k
set "ye=!ye: =!"
set "ye=!ye:012345789=!"
set "ye=!ye:0123456789=!"
>>ISee2.txt echo=!ye!
)
del ISee1.txt
setlocal disabledelayedexpansion
for /f "delims=" %%l in (ISee2.txt) do (
if not defined %%l set %%l=A & echo %%l>>ISee1.txt
)

del ISee2.txt

。。。。。。


6,::删除带-的字串或行
::删除字串少于5位的行(乱码中的连续数字不会达到5位)
。。。。。。哎,没弄好呢

Last edited by Hanyeguxing on 2009-3-4 at 02:08 ]

作者: yishanju     时间: 2009-3-4 01:27
。。。。
这难度上了不是一个等级,我不会了

作者: Hanyeguxing     时间: 2009-3-4 02:00
Originally posted by yishanju at 2009-3-4 01:27:
。。。。
这难度上了不是一个等级,我不会了

中途逃跑,是不厚道滴。。。。哈哈

作者: HAT     时间: 2009-3-4 05:37
@echo off
echo 处理中,请稍等几分钟...
sed "s//\n/g" Info.db>%temp%\a.txt
findstr ^*$ %temp%\a.txt>%temp%\b.txt
sort %temp%\b.txt>%temp%\c.txt
type nul>%temp%\d.txt
for /f "delims=" %%a in (%temp%\c.txt) do (
findstr /x /c:"%%a" %temp%\d.txt>nul 2>nul||echo.%%a>>%temp%\d.txt
)
start %temp%\d.txt

作者: zqz0012005     时间: 2009-3-4 21:55
//&@cls&cscript -nologo -e:javascript "%~f0">r.txt&start r.txt&exit/b
WScript.Echo( new ActiveXObject("Scripting.FileSystemObject").OpenTextFile("Info.db").ReadAll().match( /{6,10}/gim ).join("\n") );

作者: ily2013     时间: 2009-4-23 22:52
Originally posted by HAT at 2009-3-4 05:37:
@echo off
echo 处理中,请稍等几分钟...
sed "s//\n/g" Info.db>%temp%\a.txt
findstr ^*$ %temp%\a.txt>%temp%\b.txt
sort %temp%\b ...

本来想按这个思路回复的,细看原来您先回了

作者: netbenton     时间: 2009-4-24 00:50
能否替换的时候,把所有非数字换为0a(换行符),可以的话,再加一个
for /f %%a in (...
就可以所有数字串提取出来了。
再判断%%a是否大于9999便知道是否为QQ号了
这样做速度会快很多。

Last edited by netbenton on 2009-4-23 at 22:55 ]

作者: yishanju     时间: 2009-4-24 03:08
再判断%%a是否大于9999便知道是否为QQ号了
这思路秒啊

作者: Hanyeguxing     时间: 2009-4-25 09:07
感谢各位,太感谢了,学到很多东西