主题:请教获取文本文件的行数问题(问题较难)
zys
[专家分:0] 发布于 2005-07-20 17:15:00
假若有一文本文件A.txt,内容如下:(文件内容都是变化的,只有OK GOOD这一行是固定的)
.......
3 AA DDD
......
B KKK KKKK SS
OK GOOD
因为这个文本文件的行数不一定是4行,有可能是6行、7行。。。现在要通过查找“OK”这个单词来获取它所在的行数(现在的这个是在第6行),然后再通过这个行数获得“B KKK KKKK SS”这一行(因中间隔有一行,所以这一行行数是“OK”单词那一行6-2=4)的开头一个单词“B”
其实最终目的想获取“B KKK KKKK SS”这一行的开头一个单词“B”,但因为这一行的行数是变化的单词也是变化的,只有通过上述办法实现。请问如何用QBAIC来实现?
回复列表 (共19个回复)
沙发
moz [专家分:37620] 发布于 2005-07-20 22:20:00
拜托,请把题目说清楚一点
说明我们现在的同学的语言水平到了什么程度
问题:
如何用QB获得TXT文本文件中OK GOOD的前两行的第一个单词.
open "file.txt" for input as #1
dim s$(3)
line input #1,s$(1)
line input #2,s$(2)
do until eof(1)
line input #3,s$(3)
if instr(s$(3),"OK GOOD") then
s$(1)=ltrim$(s$(1))
i=instr(s$(1)," ")
if i>1 then s$(0)=left$(s$(1),i-1)
exit do
else
s$(1)=s$(2)
s$(2)=s$(3)
endif
loop
close
if s$(0)<>"" then print "找到目标单词为:";s$(0)
其实这种程序效率是不太高的,特别是超大文件,不过也没办法了,如果要让我来做,我肯定会用上input$(,)的,特快.我都用上瘾了.
板凳
zys [专家分:0] 发布于 2005-07-21 09:48:00
多谢moz大侠的热心解答!多你的程序编译成CZ。EXE文件运行时出现错误提示:Bad file name or unmber in module CZ at address 1869:0073
再请帮帮忙,谢谢!
3 楼
moz [专家分:37620] 发布于 2005-07-21 11:34:00
编译?
唉,你不懂用QB先运行过再编译的吗?难不成你用的是FREEBASIC?
如果在QB运行过的话会提示你第六行的#3出错的,该怎样改不会要我教吧?
4 楼
zys [专家分:0] 发布于 2005-07-21 15:20:00
“如果要让我来做,我肯定会用上input$(,)的,特快.我都用上瘾了. ”
请moz大侠出手写写,让我们见识见识呀。
5 楼
moz [专家分:37620] 发布于 2005-07-21 15:29:00
才给我二十分,你叫我怎么出手?肯定得讲讲价钱先嘛,讲好价再下单嘛.
6 楼
moz [专家分:37620] 发布于 2005-07-21 15:50:00
读入字符是比较快的,一次读入16K比你每次读一行快了不知道多少倍,
不过用instr实现判断是比较麻烦,对于你这种前面两行来说.
7 楼
zys [专家分:0] 发布于 2005-07-21 17:31:00
哈哈,moz大侠真幽默!你不是有更好的么,所以更好的出来后肯定给30分啦。
说认真的,大侠能否写写,我想不少菜鸟都想看看,有劳啦。
8 楼
moz [专家分:37620] 发布于 2005-07-22 14:04:00
deflng a-z
f$="file.txt"
t$="OK GOOD"
l=16383
lt=len(t$)
fr=freefile
cr$=chr$(13)+chr$(10)
dim c(3)
open f$ for binary as #fr
do until eof(fr)
a$=right$(a$,lt)+input$(l-lt,#fr)
i=instr(a$,t$)
if i>0 then exit do
loop
if i>0 then
s=seek(fr)-(l-lt)-(l-lt-i-lt)
if s<1 then s=1
seek #fr,s
a$=input$(l,#fr)
i=instr(a$,t$)
do
c(x)=instr(c(y)+1,a$,cr$)
y=x
x=y+1
if x>3 then x=0
loop until c(y)=0 or c(y)>i
y=x
x=y+1
if x>3 then x=0
if c(y)>0 and c(x)>c(y) then
b$=ltrim$(mid$(a$,c(y)+2,c(x)-c(y)-2)
k=instr(b$," ")
if k>1 then b$=left(b$,k-1)
endif
endif
if b$<>"" then print "找到目标单词为:";b$
因为具体的文件内容不清楚,
所以这里对于排错的语句比较多而繁琐
但因为是对内存的字符串作操作
比起文件的反复操作来就显得有速度优势了
当文件长度过大的时候就更明显了.
9 楼
zys [专家分:0] 发布于 2005-07-22 14:20:00
老大,佩服佩服!应该给30分了。
如果老大愿意帮助的话,趁机再问二个问题:
1、如何用QB获得TXT文本文件最末行的第一个单词?
2、如何把DOS环境中的变量转为QB中的变量?
10 楼
moz [专家分:37620] 发布于 2005-07-22 15:01:00
2. 用command$
1. A. 获取最后一行的字符串
B. 去掉前导空格,找到字符串中间包含的第一个空格,如果存在的话,字符前面的子串就是所求单词,如果字符串中没有空格,那么它就是结果单词了.
我来回复