■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#22170-0テキストファイルの1行読み取りryo2001-08-04(土) 11:43
     #22171-0RE#22170:テキストファイルの1行読み取りAkityon2001-08-04(土) 12:36
     #22176-0RE#22171:テキストファイルの1行読み取り−感謝ryo2001-08-04(土) 16:30
     #22193-0RE#22171:テキストファイルの1行読み取り-追加質問Beginner2001-08-06(月) 09:53
     #22197-0RE#22193:テキストファイルの1行読み取り-追加質問Say2001-08-06(月) 13:15
     #22201-0RE#22197:テキストファイルの1行読み取り-お礼Beginner2001-08-06(月) 14:02
     #22202-0RE#22197:テキストファイルの1行読み取り-追加質問Beginner2001-08-06(月) 15:15
     #22204-0RE#22202:テキストファイルの1行読み取り-追加質問よねKEN2001-08-06(月) 15:56
     #22205-0RE#22204:テキストファイルの1行読み取り-追加質問Beginner2001-08-06(月) 16:01
     #22213-0RE#22205:テキストファイルの1行読み取り-追加質問Say2001-08-07(火) 10:01
     #22214-0RE#22213:テキストファイルの1行読み取り-追加質問よねKEN2001-08-07(火) 10:30
     #22219-0RE#22214:テキストファイルの1行読み取り-追加質問Say2001-08-07(火) 12:52
     #22302-0RE#22214:テキストファイルの1行読み取り-追加お礼 Beginner2001-08-08(水) 17:36
#22170-0
テキストファイルの1行読み取り
テキストファイルをある文字列で検索し、ヒットしたらその文字列を含む一行を変数に格納する、
というプログラムを作っているのですが、うまくいきません。教えていただければありがたいです。

Dim data as string
Dim moji as string
Dim kensaku as string

moji = "aaa"

Open "abc.txt" as For Input As #1
Do while Not EOF (1)
  Line Input #1,Data

kensaku = instr(data,moji)
Loop 
Close #1

ここまではあってますでしょうか? これでmojiは検索できませんか?
(検索対象のdataには最後の一行だけしかないようなのですが・・・。)

ここでmojiがあればmojiを含む一行を抜き出したいんですが・・・。
よろしくおねがいします。
#22171-0
RE#22170:テキストファイルの1行読み取り
> kensaku = instr(data,moji)

InStr関数は、文字列の中から指定した文字列を検索し、最初に見つかった文字の位置を返します。
したがって、これでは、kensakuという変数には、文字位置の情報しか入りません。
しかし、この情報により、指定した文字列を含む行かどうか判断することができます。
InStr関数は、見つかったときに1以上の値、見つからないときに0の値を返します。
その情報で判断します。

Private Sub Form_Load()
    Dim data As String
    Dim moji As String
    Dim kensaku As String
    Dim kakuno As String
    
    moji = "aaa"
    
    Open "c:\abc.txt" For Input As #1
    Do While Not EOF(1)
      Line Input #1, data
        kensaku = InStr(data, moji)
        If kensaku <> 0 Then
            kakuno = data
        End If
    Loop
    Close #1

Debug.Print kakuno

End Sub

このようにすると、うまくいくと思います。
しかし、kakunoという変数は配列「kakuno()」にした方がいいと思います。
このままだと、領域が1つしかないので、一番最後に一致した行の情報しか格納されません。
#22176-0
RE#22171:テキストファイルの1行読み取り−感謝
ありがとうございました。
うまくいきました。ちょっとしたことなんですね。
感謝です。
#22193-0
RE#22171:テキストファイルの1行読み取り-追加質問
いつも皆さんの投稿を見て勉強させていただいております。
ryoさんの質問に対するAkityonさんの答えに追加で質問したいのですが.... 

> Private Sub Form_Load()
>     Dim data As String
>     Dim moji As String
>     Dim kensaku As String
>     Dim kakuno As String
>     
>     moji = "aaa"
>     
>     Open "c:\abc.txt" For Input As #1
>     Do While Not EOF(1)
>       Line Input #1, data
>         kensaku = InStr(data, moji)
>         If kensaku <> 0 Then
>             kakuno = data
>         End If
>     Loop
>     Close #1
> 
> Debug.Print kakuno
> 
> End Sub
> 
> このようにすると、うまくいくと思います。
> しかし、kakunoという変数は配列「kakuno()」にした方がいいと思います。
> このままだと、領域が1つしかないので、一番最後に一致した行の情報しか格納されません。

この文字列”aaa”を”bbb”に行を書き直して,ファイルを保存したいのですが
その場合はどのようにすればよいのでしょうか?
お手数お掛けしますが,よろしくお願いいたします。

#22197-0
RE#22193:テキストファイルの1行読み取り-追加質問
Handle2 = FreeFile
Open "c:\xyz.txt" For Output As #Handle2
data2 = Replace(data,moji,"bbb")     
Print #Handle2, data2 
......

Close #Handle2

みたいなかんじです
#22201-0
RE#22197:テキストファイルの1行読み取り-お礼
Sayさん,ありがとうございます。m(__)m

> Handle2 = FreeFile
> Open "c:\xyz.txt" For Output As #Handle2
> data2 = Replace(data,moji,"bbb")     
> Print #Handle2, data2 
> ......
> Close #Handle2
> 
> みたいなかんじです

Replace関数を使えばいいんですね。やっと一歩進んだ感じがします。
本当にありがとうございました。
#22202-0
RE#22197:テキストファイルの1行読み取り-追加質問
またまたお伺いしたいのですが....

> Handle2 = FreeFile
> Open "c:\xyz.txt" For Output As #Handle2
> data2 = Replace(data,moji,"bbb")     
> Print #Handle2, data2 
> ......
> 
> Close #Handle2

上記のように記述した場合,data2の行だけ保存されてしまいますよね?
他にも行があり,この行のみ書き直すにはどのようにすればよいのでしょうか?

お手数お掛けしますがよろしくお願いいたします。m(__)m
#22204-0
RE#22202:テキストファイルの1行読み取り-追加質問
> 
> またまたお伺いしたいのですが....
> 
> > Handle2 = FreeFile
> > Open "c:\xyz.txt" For Output As #Handle2
> > data2 = Replace(data,moji,"bbb")     
> > Print #Handle2, data2 
> > ......
> > 
> > Close #Handle2
> 
> 上記のように記述した場合,data2の行だけ保存されてしまいますよね?
> 他にも行があり,この行のみ書き直すにはどのようにすればよいのでしょうか?

シーケンシャルなファイルの読み書きで、一部だけを書きなおすことはできません。
全部書き込みましょう。
#22205-0
RE#22204:テキストファイルの1行読み取り-追加質問
よねKENさん,早速の回答ありがとうございます。

> シーケンシャルなファイルの読み書きで、一部だけを書きなおすことはできません。
> 全部書き込みましょう。

そうだったんですね...(*^^*ゞ
ランダムアクセスファイルだったら可能なのですか?
また勉強し直してきます。m(__)m
#22213-0
RE#22205:テキストファイルの1行読み取り-追加質問
「全部書き込みましょう」とは
ランダムアクセスにしろという意味ではありません。
一部を書き換えながら全部を保存しろという意味です。

 Private Sub Command1_Click()
     Dim data1 As String
     Dim data2 As String
     Dim moji1 As String
     Dim moji2 As String
     Dim FileName1 As String
     Dim FileName2 As String
     Dim Handle1 As Long
     Dim Handle2 As Long
     moji1 = "aaa"
     moji2 = "bbb"
     FileName1 = "c:\abc.txt"
     FileName2 = "c:\xyz.txt"
     Handle1 = FreeFile
     Handle2 = FreeFile
     
     Open FileName1 For Input As #Handle1
     Open FileName2 For Output As #Handle2

     Do Until EOF(Handle1)
         Line Input #Handle1, data1
         data2 = Replace(data1,moji1,moji2) 
         Print #Handle2, data2 
     Loop

     Close #Handle2
     Close #Handle1
 
 End Sub

みたいなかんじです

ただ、この程度の処理なら、SedとかAwkなんかのほうが
簡単にできます。(PerlやTcl/tkでも可。)
#22214-0
RE#22213:テキストファイルの1行読み取り-追加質問
> 「全部書き込みましょう」とは

これについてBeginnerさんがどう解釈されたかはわかりませんが、

> ランダムアクセスにしろという意味ではありません。

Beginnerさんの文面からはそのように捕らえられているのではなく、
単にシーケンシャルではなくランダムアクセスなら一部だけの書き直しが
可能かを聞かれているだけだと思います。

で、ランダムアクセスで行えば、一部だけを書きなおすことは可能ですが、
この場合、1レコードが固定長だからできることなので、
今回の問題に対して適応できるかどうかはわかりません。

後、無粋なツッコミですが、


>      Handle1 = FreeFile
>      Handle2 = FreeFile
>      
>      Open FileName1 For Input As #Handle1
>      Open FileName2 For Output As #Handle2

この4行はNGです。
以下のような順番にしないと空いているファイル番号は得られません。

 Handle1 = FreeFile
 Open FileName1 For Input As #Handle1
 Handle2 = FreeFile
 Open FileName2 For Output As #Handle2
#22219-0
RE#22214:テキストファイルの1行読み取り-追加質問
> この4行はNGです。
> 以下のような順番にしないと空いているファイル番号は得られません。
> 
>  Handle1 = FreeFile
>  Open FileName1 For Input As #Handle1
>  Handle2 = FreeFile
>  Open FileName2 For Output As #Handle2

ごめん・・・       
初歩的なミス・・・  (^_^;
#22302-0
RE#22214:テキストファイルの1行読み取り-追加お礼
よねKENさん,SAYさん,ありがとうございました。m(__)m
お礼が遅くなり申し訳ございません。

> > ランダムアクセスにしろという意味ではありません。
> Beginnerさんの文面からはそのように捕らえられているのではなく、
> 単にシーケンシャルではなくランダムアクセスなら一部だけの書き直しが
> 可能かを聞かれているだけだと思います。

そう捉えてました。(*^^*ゞ 

 
> で、ランダムアクセスで行えば、一部だけを書きなおすことは可能ですが、
> この場合、1レコードが固定長だからできることなので、
> 今回の問題に対して適応できるかどうかはわかりません。

そうなんですねぇ〜φ(.. )メモメモ

今回,皆さんの意見を参考になんとか作りたかったツールを作成することが出来ました。
また何かありましたら質問させてもらいますので,その時はよろしくお願いいたします。m(__)m



このページと関連する記事:
#46280-0テキストファイルの読み込み2001-08-29(水) 11:01
#40587-0テキストファイルの文字列置換方法2001-03-21(水) 15:34
#17424-0ファイル保存時の最後の改行2000-12-27(水) 09:41
#22535-0ファイルの読み込み2001-08-20(月) 23:12
#20778-0メモ帳の保存や開くを再現するには?2001-05-09(水) 14:44
#11058-0テキストファイルを読み込む2000-09-01(金) 17:12
#10926-0「開く」と「名前を付けて保存」に関する質問2000-08-27(日) 22:46
#7782-0リストボックスの書き出し2000-04-27(木) 17:29
#16318-0配列について2001-05-25(金) 22:57
#34824-0Do...Loopステートメントについて2000-12-06(水) 16:54
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)