回 帖 发 新 帖 刷新版面

主题:请教获取文本文件的行数问题(问题较难)

假若有一文本文件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个回复)

沙发

拜托,请把题目说清楚一点
说明我们现在的同学的语言水平到了什么程度

问题:
如何用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$(,)的,特快.我都用上瘾了.

板凳

多谢moz大侠的热心解答!多你的程序编译成CZ。EXE文件运行时出现错误提示:Bad file name or unmber in module CZ   at address 1869:0073

再请帮帮忙,谢谢!

3 楼

编译?
唉,你不懂用QB先运行过再编译的吗?难不成你用的是FREEBASIC?
如果在QB运行过的话会提示你第六行的#3出错的,该怎样改不会要我教吧?

4 楼

“如果要让我来做,我肯定会用上input$(,)的,特快.我都用上瘾了. ”

请moz大侠出手写写,让我们见识见识呀。

5 楼

才给我二十分,你叫我怎么出手?肯定得讲讲价钱先嘛,讲好价再下单嘛.

6 楼

读入字符是比较快的,一次读入16K比你每次读一行快了不知道多少倍,
不过用instr实现判断是比较麻烦,对于你这种前面两行来说.

7 楼

哈哈,moz大侠真幽默!你不是有更好的么,所以更好的出来后肯定给30分啦。
说认真的,大侠能否写写,我想不少菜鸟都想看看,有劳啦。

8 楼

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 楼

老大,佩服佩服!应该给30分了。
如果老大愿意帮助的话,趁机再问二个问题:
1、如何用QB获得TXT文本文件最末行的第一个单词?
2、如何把DOS环境中的变量转为QB中的变量?

10 楼

2. 用command$

1. A. 获取最后一行的字符串
   B. 去掉前导空格,找到字符串中间包含的第一个空格,如果存在的话,字符前面的子串就是所求单词,如果字符串中没有空格,那么它就是结果单词了.

我来回复

您尚未登录,请登录后再回复。点此登录或注册