tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルテキストファイル内の検索に関して
記事No1370
投稿日: 2005/02/08(Tue) 11:44
投稿者さち
[OSのVer]:Windows xp    [VBのVer]:VB.NET  

いつもお世話になります。
テキストファイルの検索について、
どなたか教えていただけないでしょうか
今以下のようなテキストファイル(4行ずつ、改行で区切られています)
があり、そのファイルをテキストボックスに入力された文字で
検索し、もしあればその4行を表示させたいと思ってます。
ヒットするデータは複数の可能性もあるのですが
それを別のテキストボックスに表示させたいと思っています。
CSVのようにカンマで区切られているわけでもなく、
改行とスペースのみで構成されたファイルですが
これを検索し4行のみ表示(スペース行からスペースの行まで?)
することは出来るでしょうか。
こちらのサイトのテキストボックスの扱いについて
見てみたのですがどうも同じケースはないようで・・・
というのも私はプログラムをはじめて日が浅く
扱ったデータはXMLしかなく(それもままならないのですが、)
テキストファイルの検索はまったくわかりません。
このファイルがXML形式だとよかったのですがデータは1万行ほどあり
XMLへの変換ソフトなど探してやってみたのですがやはりダメなようです。
こういった形式をXML形式に変換は出来るのでしょうか?
併せてどなたかご存知の方がいらしたら教えていただけないでしょうか。
よろしくお願いいたします。

(省略)





AAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBB
CCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDD

EEEEE
FFFFFFFFFFFFFFF
GGGG
HHHHHHHHHHHHHHHHHH





(省略)

[ツリー表示へ]
タイトルRe: テキストファイル内の検索に関して
記事No1373
投稿日: 2005/02/08(Tue) 12:35
投稿者じゃんぬねっと
参照先http://jeanne.wankuma.com/
じゃんぬねっと です。

 StreamReader.ReadLine() を使って 1 行読み込み、ある String に格納。

 If [ある変数].Trim() = "" Then で、空のスペース行かどうか判断

 それ以外なら、データだから、Array な変数に振り分け。

という感じで如何でしょうか?

[ツリー表示へ]
タイトルRe^2: テキストファイル内の検索に関して
記事No1374
投稿日: 2005/02/08(Tue) 12:45
投稿者さち
[OSのVer]:Windows    [VBのVer]:VB.NET  

じゃんぬねっとさん、早速ありがとうございます

「Array な変数に振り分け」
の意味がわかりませんでした。すみません。
空白でなかった行を一行ずつ配列に格納していくという意味でしょうか。

それとやはりこういった形式だとXMLへの変換は無理なのでしょうか。
よろしくお願いします

[ツリー表示へ]
タイトルRe^3: テキストファイル内の検索に関して
記事No1375
投稿日: 2005/02/08(Tue) 21:12
投稿者たくボン
さて、なぜXMLなのでしょうか?
検索するのが簡単だから?
テキストを検索したいだけならじゃんぬねっとさんの方法でよいと思いますよ^^
確実に4行セットになっているのなら、
4行まとめて読み込み
Stringに格納(CRLFを付けて)
RegExで正規表現を使って検索
ヒットするなら配列(Array、Collectionなど)に4行分まとめて格納
全検索終了後、生成された配列からヒットされた文字列を出力

プログラムの解決方法は1つだけではありません。自分の知っている技術だけでなんでもしようと言う
のではな
く、色々な方法を試してみてください(^^)

もし、このプログラムが頻繁に使われるのであればデータベースに格納するのが一般的ですし、追加・
変更の化
膿性がないのであれば、4行をCSV形式に変換したあとに検索をかけると4行ずつといったまぎらわしい
ことをし
なくてもすみますね^^

要は発想の切り替えです。なんでも回答を求めるのではなくArrayと教えてもらったらヘルプで検索して
みるこ
とも必要だと思います。

[ツリー表示へ]
タイトルありがとうございます
記事No1376
投稿日: 2005/02/08(Tue) 22:05
投稿者さち。
たくボンさん、ありがとうございます。
頂いたご返答、知らない言葉が沢山あり
(特にRegExは始めて聞く言葉でそんなクラスもあったのかと
いろいろなサイトで勉強させて頂きました。)
調べていくうちに勉強になりました。
XMLに関しては、というよりプログラムに関しては
マイクロソフトの「プログラミング簡単レシピ」
というのを見て学び始めました。
そのサイトでは扱うデータはXMLのみで
私もそれ以外扱った事がありませんでした。
ですので今回はいい機会だと思ってのことでした。
もう少し勉強してまたご連絡させてください。
よろしくお願いします。

[ツリー表示へ]
タイトルNullReferenceException?
記事No1382
投稿日: 2005/02/09(Wed) 15:04
投稿者さち
[OSのVer]:Windows xp   [VBのVer]:VB.NET  

じゃんぬねっとさん、たくボンさんありがとうございます。
結構調べたつもりなんですが、まだまだのようです。
配列に格納、までのコーディング中2点ほど
エラーが出てしまいます。
一つは NullReferenceExceptionで
以下のコードの sss(i) = ss のところです。

また昨日頂いたご返答に「4行まとめて読み込み」
というのがありましたがこれはどうされるのでしょうか
ReadLineを使用して1行づつというところまではできたのですが・・・
また「CSV形式に変換」に関してエクセルを使ったり
そういったソフトがあるのかと思い探しもしたのですが
たくボンさんが仰った変換方法はどれを指していたのでしょうか。
また下記コメントにもありますが毎回vbCrLfの挿入で
エラーが出てしまいこれを使用するのを避けていました。
長くなりましたがお気づきの点などございましたら教えて下さい。
よろしくお願いします。

++++++++++++++++++++++++++++++++++++++++++++++++++++

Dim found As String
            
If comboBox1.Text = "A" Then
found = "data/A.txt"
ElseIf comboBox1.Text = "B" Then
found = "data/B.txt"    
Else Exit Sub            
End If
            
Dim sr As New System.IO.StreamReader(found, System.Text.Encoding.Default)
Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen(found)
* 1.1))
Dim ss As String
Dim sss() As String
Dim i As Integer = 0

'ファイルの最後までループ
Do Until sr.Peek = -1
'空白行にぶつかるまで変数ssに各行を格納
Do Until sr.ReadLine.Trim() = ""
  'ss = ss & sr.ReadLine & vbCrLf
  'としたいのですがここでもvbCrLfが宣言されてませんとのメッセージが出ます。    
  ss = ss & sr.ReadLine
Loop
sss(i) = ss
ss = ""
i += 1
Loop

sr.Close()
'ためしに6つめのデータを表示
TextBox2.Text = sss(5).ToString()
            
「オブジェクト参照がインスタンスに設定されていません。」
とのメッセージですが変数ssにはなにも入ってないのでしょうか・・・


**********************************
Arrayクラスに関して
見様見真似で使ってみたのですが
Arrayクラスの使い方自体はこれで良かったのでしょうか・・・

(中略)
Dim sr As New System.IO.StreamReader(findee, System.Text.Encoding.Default)
Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen(findee) * 1.1))
Dim ss As String
Dim sss() As String
Dim i As Integer = 0
Dim myarray As Array  
'ファイルの最後までループ
Do Until sr.Peek = -1
'1行づつ読込む(文字列の連結が高速に処理される)
Do Until sr.ReadLine.Trim() = ""
'ss = ss & sr.ReadLine & vbCrLf    
ss = ss & sr.ReadLine
Loop
myarray.SetValue(ss,i)
ss = ""
i += 1
Loop

[ツリー表示へ]
タイトルRe: NullReferenceException?
記事No1383
投稿日: 2005/02/09(Wed) 17:43
投稿者るしぇ
…分かる所だけ答えます。
>エラーが出てしまいます。
>一つは NullReferenceExceptionで
>以下のコードの sss(i) = ss のところです。
↓配列の宣言は教えたハズですが同じ事してますよ?
hhttp://www.bcap.co.jp/hanafusa/bbs/wforum.cgi?no=1344&reno=1328&oya=1320&mode=msgview

>「オブジェクト参照がインスタンスに設定されていません。」
のメッセージが出た場合、その9割がプログラマによる初期化ミスです。
その近辺にブレークポイントを置いてデバッグし、使用している変数の中に
マウスカーソルを上に持っていった時に表示される変数の値で Nothing の
表記になっているモノがありますので探して下さい。
コードで判定するなら
            'If Microsoft.VisualBasic.Information.IsNothing(sss(i)) Then ' ←でも良い
            If sss(i) Is Nothing Then
                MessageBox.Show("Nothing です。")
                Exit Sub
            Else
                sss(i) = ss
            End If


>また下記コメントにもありますが毎回vbCrLfの挿入で
>エラーが出てしまいこれを使用するのを避けていました。
vbCrLf の省略しないフル名前空間は
    Microsoft.VisualBasic.Constants.vbCrLf
です。[VB.NET]のプロジェクトではデフォルトの設定として
Microsoft.VisualBasic クラスが Imports されています。
このため、名前空間を省略できます。さちさんは Sharp Develop
を使ってましたっけ?。…設定が違うのかも知れません。
プロジェクトのプロパティダイアログで[インポート]の
項目があれば見てみて下さい。

ファイルごとにプログラムコードで Imports を設定する事もできます。
プログラムの先頭に
    Imports Microsoft.VisualBasic
と表記してみて下さい。省略できるようになると思います。
また、どうしても使えない場所もあったりしますが…
そんな場合は vbCrLf の代わりに
    Chr(13) + Chr(10)
と書いても同じ意味となります。
こういった、不明なオブジェクト名がサンプルソースにあった場合、
必要な参照設定がしてあれば、[オブジェクトブラウザ]で検索すると
分かりますし、便利ですので使って下さい。

[ツリー表示へ]
タイトルありがとうございます!!!
記事No1384
投稿日: 2005/02/09(Wed) 19:21
投稿者さち。
こんにちは、るしぇさん。
いつもすみません。
「同じ事してます・・・」
はっとしました。そうでした。
同じミスでしたね。でも「・・・その9割がプログラマによる初期化ミスで・・・」
貴重なお話が聞けてよかったです。
ありがとうございます。
それからvbCrLfに関して、長いことあきらめてたことが
やっと解決しました。ホントにありがとうございます。
まだ課題は残ってるのですが、がんばってみたいと思います。
またご縁がありましたらよろしくお願いします。

[ツリー表示へ]
タイトルRe: NullReferenceException?
記事No1387
投稿日: 2005/02/12(Sat) 05:39
投稿者たくボン
質問いただいていたのですが、仕事の合間なので返事が遅くなりました。

> また昨日頂いたご返答に「4行まとめて読み込み」
> というのがありましたがこれはどうされるのでしょうか

これは、さちさんがされているように、4行ずつ読み込むことでいいですよ^^
4行が必ず1セットになっているのなら、ループを使わずに4回ReadLine()をしてもいいですね。
それと、vbCrLfの代わりに,(カンマ)を付ければCSVになりますよね^^
CSVの概要は「カンマで区切られたテキスト形式」ですから、これで立派なCSVですよ(笑)
CSVの考え方は色々応用できるのでぜひマスターしてくださいね^^

[ツリー表示へ]
タイトルありがとうm(._.)m ございます
記事No1400
投稿日: 2005/02/14(Mon) 20:54
投稿者さち。
気にかけていただいて
ありがとうございます。
ホントに参考になりました。
結局すべてが4行ではなかったのですが
おっしゃられていたことは気づきませんでしたし
CSVファイルに関しても扱ったことがないので
是非挑戦してみたいと思います。
色々とお世話になりました。
まだ問題が多々あるのですがもう少し自分でがんばってみたいと思います。
ありがとうございました。

[ツリー表示へ]