テキストファイルから
Posted: 2005年12月10日(土) 23:47
テキストファイルからデータを変数に読み込んで、そのデータが何行あるかを調べるにはどうすればいいですか?
また、そのデータのn行目の内容だけを取り出すのはどうすればいいですか?
よろしくおねがいします
また、そのデータのn行目の内容だけを取り出すのはどうすればいいですか?
よろしくおねがいします
ちゃんと(?)やるならテキストファイルからデータを変数に読み込んで、そのデータが何行あるかを調べるにはどうすればいいですか?
また、そのデータのn行目の内容だけを取り出すのはどうすればいいですか?
コード: 全て選択
#include "EmulateAB2.sbp"
Dim strTarget As String '探すデータ文字列を格納
Dim strCopy As String '取り出した文字列を格納
Dim strTextSource As String 'ファイルからの読み取りに使用
Dim nLine As Long '見つかった行番号を格納
strTarget = "探すデータ文字列"
Open "file.txt" For Input As #1
While( 0=Eof(1) )
'一行ずつ読み込む
LineInput 1, strTextSource
'↑AB4では以下のように変える必要があるかも↓
'LineInput( 1, strTextSource )
'読み込んだデータ内に目的のデータが有るか検索
nLine = InStr( 1, strTextSource, strTarget )
If( nLine<>NULL )Then
'見つかったら検索ループを抜ける。
ExitWhile
EndIf
Wend
Close 1
'データをコピー(取り出す)・・・ってそのままなのでやる意味ないですね^^;
strCopy = strTextSource
'表示してみる
strCopy = Str$(nLine) + "行目:" + strCopy
MsgBox NULL, strCopy
コード: 全て選択
#N88BASIC
Dim buf As String ' 行単位に分ける文字列
Dim error As Long ' ファイル読み込みのエラーがあるかどうか
Dim lines As Long ' 行数
Dim linelist As *Long ' 行の開始位置・終了位置のリスト
buf=FileContent("bitmap.abp", error)
If error Then
Print "Error!"
END()
End If
lines=GetLines(buf)
linelist=malloc((lines+1)*SizeOf(Long))
GetLineList(buf, linelist)
Print "行数は", lines
Print "3行目は", Mid0(buf, linelist[2], linelist[3]-linelist[2]-2)
Print "10行目は", Mid0(buf, linelist[9], linelist[10]-linelist[9]-2)
free(linelist)
' 行数の取得
Function GetLines(s As String) As Long
Dim slen As Long ' 文字列の長さ
Dim i As Long
slen=Len(s)
GetLines=1
' \r(13)と\n(10)が連続している部分を検索する
For i=1 To slen-1
If s[i-1]=13 And s=10 Then
GetLines=GetLines+1
End If
Next
End Function
' 行のリストの取得(行数+1の数だけのLong型配列を準備して下さい)
Sub GetLineList(s As String, linelist As *Long)
Dim slen As Long ' 文字列の長さ
Dim i As Long, p As Long
slen=Len(s)
linelist[0]=1
p=1
' ヌル文字に達するまで,\r(13)と\n(10)が連続している部分を検索する
For i=1 To slen-1
If s[i-1]=13 And s=10 Then
linelist[p]=i+2
p=p+1
End If
Next
linelist[p]=slen+2
End Sub
' ファイルの読み込み
Function FileContent(fname As String)(ByRef error As Long) As String
Dim hF As Long, fLen As Long, fLen2 As DWord, dummy As DWord
hF=CreateFile(fname, GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hF=INVALID_HANDLE_VALUE Then
FileContent=""
If VarPtr(error)<>0 Then error=-1
Else
fLen=GetFileSize(hF,VarPtr(fLen2))
If fLen2>0 Then fLen=&H7FFFFFFF
FileContent=ZeroString(fLen+1)
ReadFile(hF, FileContent, fLen, VarPtr(dummy), ByVal 0)
If dummy<>fLen And VarPtr(error)<>0 Then error=1
CloseHandle(hF)
End If
End Function
' Mid$関数の改造版:第3引数が0以下の場合は空の文字列を返す
Function Mid0(buf As String, StartPos As Long, ReadLength As Long) As String
Dim length As Long
StartPos=StartPos-1
If StartPos<0 Then
'error
'Debug
Exit Function
End If
length=Len(buf)
If length<=StartPos Then Exit Function
If ReadLength<=0 Then Exit Function
If ReadLength>length-StartPos Then
ReadLength=length-StartPos
End If
Mid0=ZeroString(ReadLength)
memcpy(Mid0,StrPtr(buf)+StartPos,ReadLength)
End Function
コード: 全て選択
CreateFile(...
ReadFile(...
CloseHandle(...
Dim Tx as String
SendMessage(Ctl-Handle,WM_SETTEXT,0,StrPtr(TX))
SendMessage(Ctl-Handle,EM_GETLINECOUNT,0,0)
Dim Bx[1024] as Byte
SetWord(Bx,1024)
SendMessage(Ctl-Handle,EM_GETSEL,N1,Bx)
淡幻星さんも私もコマンドプロンプトで書いていますが,どちらもコマンドライン以外でも応用できますよ。シルフィード さんが書きました:どうもありがとうございます。
今作ってるのは、テキスト(ファイル名は決まっている)から、[改行区切りののデータ(2005/12/3のような形式で日付が不規則に入ってます・・・)]を受け取り、
コンボボックスに入れるものです。
なので、できればコマンドプロンプトではないほうがいいです。
"EDIT"もできれば、あまり使いたくありませんが、他によい方法がないようでしたら、この方法でいくことにします。