テキストファイルからデータを変数に読み込んで、そのデータが何行あるかを調べるにはどうすればいいですか?
また、そのデータのn行目の内容だけを取り出すのはどうすればいいですか?
よろしくおねがいします
テキストファイルから
Re: テキストファイルから
ちゃんと(?)やるならテキストファイルからデータを変数に読み込んで、そのデータが何行あるかを調べるにはどうすればいいですか?
また、そのデータのn行目の内容だけを取り出すのはどうすればいいですか?
CreateFile()でファイルを開いて、
ReadFile()で内容を全部読み込んで、
lstrstr()あたりでデータを検索し、
lstrcpy()あたりでコピーして取り出す。
行数を知るには、そこまでの途中にある改行コードの個数を
lstrchr()あたりで検索して数える。
こんな感じになると思います。
(・・・あれ?lstrstr()って標準で使えたっけ?(汗)
もしだめだったら、実践コードモジュールに定義が載ってますので、
そちらを参照ください^^;)
簡単にやるなら、実践コードモジュールのLineInput()を使うのが
楽だと思います。
こちらのコードを
適当なファイル(仮にEmulateAB2.sbpとします)に保存し、
こんな感じでできると思います。
コード: 全て選択
#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
Re: テキストファイルから
自分がコードを組んでいる間に,淡幻星さんが先に投稿していました(汗)
ただ,私は手法が異なる(※)ので一応投稿しておきます。
※一度読み込み済みのテキストデータに対して適用する方法です。行に分割した結果を保存しておけるという利点があります。
※空の行を選ぶと(Mid$の第3引数が0になると)バグります。(汗)
今日はもう時間がないので近いうち修正します。
→2005.12.11 10:24修正済。
※2005.12.11 17:16再修正。
ただ,私は手法が異なる(※)ので一応投稿しておきます。
※一度読み込み済みのテキストデータに対して適用する方法です。行に分割した結果を保存しておけるという利点があります。
コードの内容 [ここをクリックすると内容が表示されます]
コード: 全て選択
#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
※空の行を選ぶと(Mid$の第3引数が0になると)バグります。(汗)
今日はもう時間がないので近いうち修正します。
→2005.12.11 10:24修正済。
※2005.12.11 17:16再修正。
最後に編集したユーザー Sinryow [ 2005年12月11日(日) 17:16 ], 累計 2 回
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
目的によって色々な手段が考えられますが、この場合 何行・n行取得
なので私が簡単だと思うのは”EDIT"にファイルを一括で読み込んで
あとはSendMessageを使用して「EM_GETLINECOUNT・EM_GETSEL」で
良いと思います。
なので私が簡単だと思うのは”EDIT"にファイルを一括で読み込んで
あとはSendMessageを使用して「EM_GETLINECOUNT・EM_GETSEL」で
良いと思います。
コード: 全て選択
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)
Re: テキストファイルから
淡幻星さん
Sinryowさん
Uhspさん
どうもありがとうございます。
今作ってるのは、テキスト(ファイル名は決まっている)から、[改行区切りののデータ(2005/12/3のような形式で日付が不規則に入ってます・・・)]を受け取り、
コンボボックスに入れるものです。
なので、できればコマンドプロンプトではないほうがいいです。
"EDIT"もできれば、あまり使いたくありませんが、他によい方法がないようでしたら、この方法でいくことにします。
よろしくおねがいします。(←たぶん口癖)
Sinryowさん
Uhspさん
どうもありがとうございます。
今作ってるのは、テキスト(ファイル名は決まっている)から、[改行区切りののデータ(2005/12/3のような形式で日付が不規則に入ってます・・・)]を受け取り、
コンボボックスに入れるものです。
なので、できればコマンドプロンプトではないほうがいいです。
"EDIT"もできれば、あまり使いたくありませんが、他によい方法がないようでしたら、この方法でいくことにします。
よろしくおねがいします。(←たぶん口癖)
Re: テキストファイルから
淡幻星さんも私もコマンドプロンプトで書いていますが,どちらもコマンドライン以外でも応用できますよ。シルフィード さんが書きました:どうもありがとうございます。
今作ってるのは、テキスト(ファイル名は決まっている)から、[改行区切りののデータ(2005/12/3のような形式で日付が不規則に入ってます・・・)]を受け取り、
コンボボックスに入れるものです。
なので、できればコマンドプロンプトではないほうがいいです。
"EDIT"もできれば、あまり使いたくありませんが、他によい方法がないようでしたら、この方法でいくことにします。
行に分解するロジックだけはそのまま用い,画面に表示する部分だけを変えればよいですので。
参考にプログラムを作ってみました。
テキストファイルを指定し,それを1行ずつ分けてコンボボックスに格納するものです。
http://www.sinryow.net/hitori/TextList.lzh
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
Re: テキストファイルから
> 淡幻星さんも私もコマンドプロンプトで書いていますが,どちらもコマンドライン以外でも応用できますよ。
> 行に分解するロジックだけはそのまま用い,画面に表示する部分だけを変えればよいですので。
>
> 参考にプログラムを作ってみました。
> テキストファイルを指定し,それを1行ずつ分けてコンボボックスに格納するものです。
> http://www.sinryow.net/hitori/TextList.lzh
Sinryow さん
サンプルまで作っていただきありがとうございます。
これで作りたいものが作れます。
> 行に分解するロジックだけはそのまま用い,画面に表示する部分だけを変えればよいですので。
>
> 参考にプログラムを作ってみました。
> テキストファイルを指定し,それを1行ずつ分けてコンボボックスに格納するものです。
> http://www.sinryow.net/hitori/TextList.lzh
Sinryow さん
サンプルまで作っていただきありがとうございます。
これで作りたいものが作れます。