回 帖 发 新 帖 刷新版面

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

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

11 楼

关键是不知怎样才能“获取最后一行的字符串”

对于如何把DOS环境中的变量转为QB中的变量,似乎是用ENVIRON$函数,但不会用。

12 楼

对,环境变量是用ENVIRON$
你尝试把这个函数显示出来看看
也可以尝试更改这个函数看看

获取最后一行:
1. 最传统的办法是用line input直至文件末为止.

13 楼

不能用ENVIRON"XXX=???"创建,但可以修改

题外话:
其实在Win2000/Xp的%ComSpec%的版本是5。00
所以shell"ver"显示MS-DOS 5.00
其他的DOS里面是DOS的版本号
不信moz试试

14 楼

请问怎样把下面的代码弄成函数形式,即要查找多个这样的文本文件

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)

15 楼

函数很简单的
首先,你需要的条件是什么?  (这就是参数表)
然后,你需要的结果是什么?  (这就是返回值)

在你的这个问题里,说的是多个文件,也就是说条件只是多个变化的文件名(当然,"OK GOOD"也可以作为可变的参数的)
结果是需要前两行的第一个单词,也就是需要求一个字符串
这就简单了:

在你上面的代码加几句

[color=FF00FF]function findchr$(filess$)[/color]
k$="OK GOOD"
[color=FF00FF]f%=freefile[/color]
open [color=FF00FF]filess$[/color] for input as #f%
dim s$(3)
line input [color=FF00FF]#f%[/color],s$(1)
line input [color=FF00FF]#f%[/color],s$(2)
do until eof(1)
   line input [color=FF00FF]#f%[/color],s$(3)
   if instr(s$(3),k$) 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 [color=FF00FF]#f%[/color]
[color=FF00FF]findchr$=s$(0)[/color]
[color=FF00FF]end function[/color]

16 楼

moz大侠真的风格高尚啊,不仅授人于鱼,更授于渔!在此真诚说声谢谢!
我想给你评上30分,但系统却说一个人在同一帖中最高得分不能超过50分,所以看下一次向您请教时再给分吧。(尽管我知道您不是为得分而帮助人的,但我却非常乐意为您加分)

17 楼

拜托,别把我抬太高了.
如果我帮到你一丁点忙的话
你只要轻描淡写的随便说一声谢谢就可以了,我就已经很高兴了.
评论我风格高尚(狂汗猛汗)之类的就太过份了.
简直让我无地自容了.

18 楼

moz,您好!我学你上一帖做函数,但下面您写的这个我弄了很久都没有写成功,恳请您再帮忙一次,把下面的写成函数形式,谢谢。

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$

19 楼

deflng a-z
[color=FF00FF]function Findword$(f$,t$)[/color]
'f$="file.txt" [color=FF00FF]这是参数里面的文件名[/color]
't$="OK GOOD"  [color=FF00FF]这是参数里面需要找的词[/color]
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

[color=FF00FF]FindWord$=b$[/color]
[color=FF00FF]end function[/color]

我来回复

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