テキストファイルから

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
シルフィード

テキストファイルから

#1 投稿記事 by シルフィード »

テキストファイルからデータを変数に読み込んで、そのデータが何行あるかを調べるにはどうすればいいですか?
また、そのデータのn行目の内容だけを取り出すのはどうすればいいですか?

よろしくおねがいします
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: テキストファイルから

#2 投稿記事 by 淡幻星 »

テキストファイルからデータを変数に読み込んで、そのデータが何行あるかを調べるにはどうすればいいですか?
また、そのデータの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
動作確認してないので、ミスってたら御免なさい。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

Re: テキストファイルから

#3 投稿記事 by Sinryow »

自分がコードを組んでいる間に,淡幻星さんが先に投稿していました(汗)
ただ,私は手法が異なる(※)ので一応投稿しておきます。

※一度読み込み済みのテキストデータに対して適用する方法です。行に分割した結果を保存しておけるという利点があります。


※空の行を選ぶと(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/
' ============================================================
Uhsp

#4 投稿記事 by Uhsp »

 目的によって色々な手段が考えられますが、この場合 何行・n行取得
なので私が簡単だと思うのは”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: テキストファイルから

#5 投稿記事 by シルフィード »

淡幻星さん
Sinryowさん
Uhspさん

どうもありがとうございます。

今作ってるのは、テキスト(ファイル名は決まっている)から、[改行区切りののデータ(2005/12/3のような形式で日付が不規則に入ってます・・・)]を受け取り、
コンボボックスに入れるものです。
なので、できればコマンドプロンプトではないほうがいいです。
"EDIT"もできれば、あまり使いたくありませんが、他によい方法がないようでしたら、この方法でいくことにします。

よろしくおねがいします。(←たぶん口癖)
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

Re: テキストファイルから

#6 投稿記事 by Sinryow »

シルフィード さんが書きました:どうもありがとうございます。

今作ってるのは、テキスト(ファイル名は決まっている)から、[改行区切りののデータ(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/
' ============================================================
シルフィード

Re: テキストファイルから

#7 投稿記事 by シルフィード »

> 淡幻星さんも私もコマンドプロンプトで書いていますが,どちらもコマンドライン以外でも応用できますよ。
> 行に分解するロジックだけはそのまま用い,画面に表示する部分だけを変えればよいですので。
>
> 参考にプログラムを作ってみました。
> テキストファイルを指定し,それを1行ずつ分けてコンボボックスに格納するものです。
> http://www.sinryow.net/hitori/TextList.lzh

Sinryow さん
サンプルまで作っていただきありがとうございます。
これで作りたいものが作れます。
返信する