テキストファイルの中味を全部読み込んで、テキストボックスに表示するというコードをOpenステートメントを使って書いています。

その際、1つの種類のデータを1つのテキストファィルとして書き出し&読み込み
しているのですが、これですと種類が増えていくとともにテキストファイルの
数もどんどん増えてしまい効率が悪いです。

で、それらを1つのテキストファイルにまとめておいて、中をセクションに
区切って、それを読み込み&書き出しする方法はあるのでしょうか?

データが1行ですと分かるのですが、それぞれが長いテキストデータを1つの
テキストファイルに区切って書き出し&読み込みする方法が分かりません。

どなたか教えてください!!!!!!!
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

例えば、セクションの区切りについて、次のようなルールにしたとします。



行頭に[SectionXXX]という文字列がある事。
XXXはセクションを表す3桁の数字
この場合は、000から999まで有効ですね。

順番に取得する場合は、数字の手前までの文字列を比較して、ループを回せば、数字がいくつであっても全部取り込めます。

特定のセクションを指定して取り出す場合は、予めどこかでその数字(これは文字列として格納する)を指定する変数にぶち込んで、ループの中で更に比較して、該当する物だけを取り出せばよいと。
この場合、比較する文字列は、
"[Section" & strNum
みたいな感じになりますね。

この変数には、例えばテキストボックスにセクションNoを入力するようにしておいて、この値があったらこの変数にいれるとか、そんな風にすれば、よさげです。

どうでしょうか?

この回答への補足

回答ありがとうございます。う~ん、正直難解ですねぇ。
IfとLoopを組み合わせるというところがどうも・・・。

勉強が足りなくてすみません。
本を読みながら試行錯誤してみます。

補足日時:2002/03/07 22:11
    • good
    • 0

正直目的とあうかどうか分かりませんが、INIファイルを使用するのもひとつの選択肢だと思います。


INIファイルだと、APIを使用すれば、比較的楽に属性をテキストファイルに保存することができますよ。
    • good
    • 0

申し訳ありません。


呼び捨ててしまいました。
ごめんなさい...

この回答への補足

いえいえどういたしまして。

みなさんのご意見を参考にして、私なりに考えてみました。
同じセクションの行頭に特定の文字を挿入しました。


[Section1]デ-タ1デ-タ1デ-タ1デ-タ1デ-タ1
[Section1]デ-タ1デ-タ1デ-タ1
[Section1]デ-タ1デ-タ1

[Section2]デ-タ2デ-タ2デ-タ2デ-タ2
[Section2]デ-タ2デ-タ2

[Section3]デ-タ3デ-タ3デ-タ3デ-タ3デ-タ3
[Section3]デ-タ3デ-タ3デ-タ3デ-タ3デ-タ3デ-タ3
[Section3]デ-タ3デ-タ3デ-タ3デ-タ3デ-タ3デ-タ3

で、例えば[Section2]の文字列だけを抜き出してテキストボックスに表示
するコードを下のようにしてみました。

Dim aa, readdata, bb As String
Open App.Path & "\" & "test.txt" For Input As #1
Do Until EOF(1)
Line Input #1, aa
bb = Left(aa, 6)
If bb = "[Section2]" Then
readdata = readdata & aa & vbCrLf
End If
Loop
Close #1
Text1.Text = readdata

こんな感じでどうでしょうか?
多分もっと効率のいいコードがあるかも知れませんが、へっぽこの私には
これが限界です。

補足日時:2002/03/08 23:21
    • good
    • 0

fujiyama2002と同じく文字列の連結でデータを取得しています。


自分はセクションの数が限られている為、一度配列にセットし
後から再度取りこむ形を取っています。
数が決められない場合はyou-mさんがおっしゃる様に、
先頭より順読みし、ループとIF文で取得すれば・・・
と思います。

                          以上
    • good
    • 0

you-mさんと同様に自分も区切り文字


[Excel]や[Access]といった括弧書きで
区別しております。

この回答への補足

セクションの区切りを入れておいて読み込むという考え方は理解できるのですが、
どうすればいいのかが分かりません。

例えば、

[section 1]
データ1データ1データ1データ1データ1データ1
データ1データ1データ1データ1データ1データ1
データ1データ1データ1データ1データ1データ1
データ1データ1データ1データ1データ1データ1

[section 2]
データ2データ2データ2データ2データ2データ2
データ2データ2データ2データ2データ2データ2
データ2データ2データ2データ2データ2データ2

というテキストファイルがあったとして、[section 1]の部分の読み込みは

Open App.Path & "\test.txt" For Input As #1
Do Until data = "[section 2]"
Line Input #1, data
alldata = alldata & data & vbCrlf
Loop
Close #1
aaa = Replace(alldata, "[section 2]", "")
bbb = Replace(aaa, "[section 1]", "")
text1.text = bbb

    (初心者なので変なコードですが・・・)

というふうに、次にくるセクションの頭までを指定して読み込めば良いと思う
のですが、[section 2]の部分だけを読み込みたい時のコードが全く分かりません。
上記のやり方では、先頭のセクションだけを読み込むことは可能ですが、
以降のセクションだけを抜き出すのはできません。
ここが今ひとつ理解できないところです。

初心者なもので、へっぽこですみません。
どうか教えてください!!!
お願いいたします。

補足日時:2002/03/07 20:17
    • good
    • 0

やり方というか、やり方自体自分で決めれば済む事だと思いますよ。



例えば、セクションの区切りの行には、行頭に(本文で使われないような)特定のパターンを入れておいて、読み込むときには、一つのセクションを読み出すのに、そのパターンを判定するループにすればいいでしょう。
同様に書き出す場合も、一つのセクションを書き込んだら、そのパターンを含んだ区切りをいれるとか。

どうでしょうか?

この回答への補足

回答いただき、ありがとうございます。
現在、ninja972さんに質問させていただいた内容で悩んでいます。
ご助言を!!!!!!!

補足日時:2002/03/07 20:20
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルの読み込み

タイピングソフトを作っています。

メインのフォーム(タイピング画面)に
配列wk1(99)(ローマ字用)、wk2(99)(日本語)を宣言してます。

まだ初級しか作成してないでメインフォーム(タイピング画面)で

Private sub Yomikomi()
wk1(0)="hudebako",wk(0)="筆箱"
wk1(1)="pasokonn",wk(1)="パソコン"

wk1(99)="neko",wk(99)="ネコ"
End sub
という感じで100個読み込ませてます。

初級だけならよいのですが、その他に中級、上級の2つを準備したいのです。

そうなるとメインのプログラムがとても長くなってしまうので
syokyuu,tyuukyuu,jyoukyuuというファイル名で3つのファイルを
テキストファイルか何かで準備して
メインフォームでそのファイル(指定したファイル)を読み込んで
wk1,wk2に計100個保存したいのです。


そういう場合はどのように設定すればよいですか(読み込んで保存すること)?
準備するファイルはテキストファイルでもいいのでしょうか?
またその中身の記述はどうすればよいですか?

長くなりましたがよろしくお願いします。

タイピングソフトを作っています。

メインのフォーム(タイピング画面)に
配列wk1(99)(ローマ字用)、wk2(99)(日本語)を宣言してます。

まだ初級しか作成してないでメインフォーム(タイピング画面)で

Private sub Yomikomi()
wk1(0)="hudebako",wk(0)="筆箱"
wk1(1)="pasokonn",wk(1)="パソコン"

wk1(99)="neko",wk(99)="ネコ"
End sub
という感じで100個読み込ませてます。

初級だけならよいのですが、その他に中級、上級の2つを準備したいのです。

そうなるとメイ...続きを読む

Aベストアンサー

確かにこの場合配列を固定させるのは望ましくないかもしれません。

初級/中級/上級の違いは、[主に読み込みファイル/読み込んだデータを収納する変数]が違うだけで、[読み込み方/読み込んだデータを収める方法]は同じはずです。
違う部分をパラメータで切り分け、共通関数を使用すべきです。



サンプルです。

処理内容としては
1.プログラムで使用するテキストファイルの宣言
2.テキストファイルの各問題の区切り文字を宣言
3.各問題を読み込む
4.ファイルサイズを得る
5.ファイルサイズの領域を文字列にセットする
6.テキストを取得する
7.文字列を2で設定した文字で区切り配列にセットする(wk1/wk2/wk3に返す値になる)
8.読み込んだデータ件数を表示
です。

主な関数
※FreeFile
Open "FileNeme1" For Input As #1
  Open "FileNeme1" For Input As #2
  Close #2
Close #1
このようなファイル番号#1/2などをプログラムで固定で直打ちをしないでも、空き番号が取得できます。重複する事がないので、バグ回避にもつながります。
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctfreefile.htm

※Split
引数1の文字列を、引数2の文字列にて区切ります。サンプルプログラムでは
Const CUT_STR As String = vbLf
として改行コードで区切られています。よって、行数の分だけの問題数となります。またvbLfを","などに変更すると、カンマ区切りで配列を創生します。
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctsplit.htm

※Ubound
配列要素の最大値を得る事ができます。ちなみにLboundは配列要素の最小値を得ます。
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctubound.htm
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctuboundx.htm


FreeFileの使用方法を尋ねていたので参考までに書いたけど、各関数の上にカーソルがある状態でファンクションキーF1を押すと、関連ヘルプ(MSDN)を表示します。各関数はできるだけ調べるように努力しましょう。
もしMSDNがインストールされていない場合、
http://www.microsoft.com/japan/developer/default.asp
にオンラインMSDNがありますので、そちらで検索をしましょう。

Sub Main()
  '問題ファイル(1)
  Const TEST1 As String = "c:\syokyuu.txt"
  Const TEST2 As String = "c:\tyuukyuu.txt"
  Const TEST3 As String = "c:\jyoukyuu.txt"
  
  '問題の区切り(改行区切り)(2)
  Const CUT_STR As String = vbLf
  
  Dim wk1 As Variant     '初級
  Dim wk2 As Variant     '中級
  Dim wk3 As Variant     '上級
  
  '問題ファイルの読み込み(3)
  If Not subTestRead(TEST1, CUT_STR, wk1) Then
    Call MsgBox("[" & TEST1 & "]失敗")
    GoTo PGMEND
  End If
  If Not subTestRead(TEST2, CUT_STR, wk2) Then
    Call MsgBox("[" & TEST2 & "]失敗")
    GoTo PGMEND
  End If
  If Not subTestRead(TEST3, CUT_STR, wk3) Then
    Call MsgBox("[" & TEST3 & "]失敗")
    GoTo PGMEND
  End If
  
  '読み込んだ情報をメッセージボックスで出力(8)
  Call MsgBox( _
    "[" & TEST1 & "]は" & UBound(wk1) + 1 & "問のの問題があります" & vbNewLine _
    & "[" & TEST2 & "]は" & UBound(wk2) + 1 & "問のの問題があります" & vbNewLine _
    & "[" & TEST3 & "]は" & UBound(wk3) + 1 & "問のの問題があります" _
    )
PGMEND:
End Sub

'テキストファイルを読み込み、配列にして返す
'パラメータ1:ファイルパス
'パラメータ2:テキストファイルは何区切り?
'パラメータ3:返す配列
Public Function subTestRead(inFilePath As String, strCut As String, outTestAry As Variant) As Boolean
  Dim lngFileSize As Long 'ファイルサイズ
  Dim lngFileNum As Long 'ファイルナンバ
  
  Dim strBuff   As String  '文字列ワーク
  
  'ファイルサイズの取得(4)
  On Error Resume Next
  lngFileSize = FileLen(inFilePath)
  On Error GoTo 0
  'サイズが取得できない時NG処理
  If lngFileSize < 1 Then
    Exit Function
  End If
  
  '取得するためのサイズを用意(5)
  strBuff = String(lngFileSize, vbNullChar)
 
  'テキスト取得(6)
  lngFileNum = FreeFile
  Open inFilePath For Binary As #lngFileNum
    Get #lngFileNum, , strBuff
  Close #lngFileNum
  
  '文字列を区切り、配列に変換(7)
  outTestAry = Split(strBuff, strCut)
  
  'OKを記す
  subTestRead = True
End Function

確かにこの場合配列を固定させるのは望ましくないかもしれません。

初級/中級/上級の違いは、[主に読み込みファイル/読み込んだデータを収納する変数]が違うだけで、[読み込み方/読み込んだデータを収める方法]は同じはずです。
違う部分をパラメータで切り分け、共通関数を使用すべきです。



サンプルです。

処理内容としては
1.プログラムで使用するテキストファイルの宣言
2.テキストファイルの各問題の区切り文字を宣言
3.各問題を読み込む
4.ファイルサイズを得る
5.ファイル...続きを読む

Qテキストファイルの行を指定して読み込み

テキストファイルの読み込みたい行を指定して
テキストボックスに表示させたいのですが、
どのようにすればよいでしょうか?

StreamReaderには一行分の文字を読み取るReadLine
メソッドがありますが、行は指定はできないようです。
良い方法があればアドバイスを頂きたいです。
よろしくお願いします。

---
開発環境:VS2005 pro
OS:Vista

Aベストアンサー

指定したい行まで、
ReadLineをループでくるくる回しては?

int i = 1;
while (line = sr.ReadLine()) != null) {
if( i = 10 ){
lineを表示する;
}
i++;
}

みたいに。
調べないで書いているので、文法間違ってたらごめんなさい。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???


人気Q&Aランキング