C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: テキストファイルから特定のキーワードを3行分表示させる


(過去ログ 139 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■81987 / inTopicNo.1)  テキストファイルから特定のキーワードを3行分表示させる
  
□投稿者/ 初心者中の初心者 (2回)-(2016/11/27(Sun) 18:41:01)

分類:[C#] 

プログラム初心者です。

C#でテキストファイルを読み込み、キーワードを探して、キーワードを含む3行のみ表示させるプログラムを作成している
途中です。
テキストを読み込むまではできたのですが、キーワードを見つけてキーワードを含む3行を表示させることができません。
キーワードはテキストボックスからの検索ではなく、ボタンを押してキーワードを含む3行を表示させたいと思っています。

・キーワードは2つ(◇受信、◇送信)
・キーワードを含む行には数字が入ってます。
・テキストファイルの中にはキーワードは何個もあるので、対象の行はすべて表示させたいです。
わかりにくいと思いますが、その時は質問をお願いします。


-----------------------------------------------------


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "テキスト(*.txt,*.dat,*.html)|*.txt;*.log;*.dat;*.html|" + "All files(*.*)|*.*";
            if (openFileDialog1.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            textBox1.Text = openFileDialog1.FileName;//ファイル名、パス取得
            using (var fin = openFileDialog1.OpenFile())
            {

                var buff = new byte[fin.Length];
                fin.Read(buff, 0, buff.Length);
                try
                {
                    var enc = Encoding.GetEncoding("shift_jis",
                        EncoderFallback.ExceptionFallback, DecoderFallback.
                        ExceptionFallback);

                    var text = enc.GetString(buff);
                    richTextBox1.Text = (text.Length > 0 &&
                        text[0] == '\ufeff') ? text.Substring(1) : text;

                }
                catch (DecoderFallbackException)
                {
                    richTextBox1.Text = Encoding.Default.
                        GetString(buff);
                }
            }
            using (var infile = new StreamReader(new FileStream
                (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.
                Read)))
            {
                var lines = new List<String>();
                for (;;)
                {
                    var line = infile.ReadLine();
                    if (line == null) break;
                    lines.Add(line);
                }
                richTextBox1.Lines = lines.ToArray();
                infile.Close();

            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
        }

引用返信 編集キー/
■81990 / inTopicNo.2)  Re[1]: テキストファイルから特定のキーワードを3行分表示させる
□投稿者/ Azulean (738回)-(2016/11/27(Sun) 19:01:59)
No81987 (初心者中の初心者 さん) に返信
> テキストを読み込むまではできたのですが、キーワードを見つけてキーワードを含む3行を表示させることができません。
> キーワードはテキストボックスからの検索ではなく、ボタンを押してキーワードを含む3行を表示させたいと思っています。

これって、「キーワードを含む前後3行」って言う意味であれば、ちゃんと書けてない気がします…。
-----

Q1.たとえば、「キーワードを含む1行」であれば実現できますか?
Q2.キーワードを含む行が2行続いた場合、「キーワードを含む3行」が重複しながら表示されるのか、「キーワードを含む4行」になるのか?


Q1 が Yes、Q2 が 後者であれば、以下のような感じになると思います。

・直前の行を保持しておく string 変数と、条件に一致しているという bool の変数を作る。
・条件に合致すれば直前の行を追加しつつ、この行自身も追加しつつ、条件に一致しているという bool の変数に true を入れておく。
・bool の変数が true であれば次のループでも行を追加しつつ、条件に合致しなくなれば bool の変数に false を入れておく。
・bool の変数が false かつ、この行が条件に合致しない場合は、直前の行を保持しておく string 変数にこの行を入れておく。(上書きする)
引用返信 編集キー/
■81991 / inTopicNo.3)  Re[2]: テキストファイルから特定のキーワードを3行分表示させる
□投稿者/ 初心者中の初心者 (5回)-(2016/11/27(Sun) 20:44:11)
No81990 (Azulean さん) に返信
> ■No81987 (初心者中の初心者 さん) に返信
>>テキストを読み込むまではできたのですが、キーワードを見つけてキーワードを含む3行を表示させることができません。
>>キーワードはテキストボックスからの検索ではなく、ボタンを押してキーワードを含む3行を表示させたいと思っています。
>
> これって、「キーワードを含む前後3行」って言う意味であれば、ちゃんと書けてない気がします…。
> -----
>
> Q1.たとえば、「キーワードを含む1行」であれば実現できますか?
A1.調べたのですが、初心者であまり分かりませんでした。


> Q2.キーワードを含む行が2行続いた場合、「キーワードを含む3行」が重複しながら表示されるのか、「キーワードを含む4行」になるのか?
 A2. テキストの中にキーワードが2行続くことはありません

読み込むテキストはこんな感じです。

◇受信 <<
00:00:01,357 - ----: 受信データ
00:00:01,357 - ----: 00-02-00-06-0B-01-00-82-FF-6D-03-00
00:00:01,357 -
00:00:01,357 受信データ
00:00:01,357  X_01 (E_01) → M_01
00:00:01,357 00-02-00-06-0B-01-00-82-FF-6D-03-00
00:00:01,357 X_01 (E_01) → M_01
00:00:01,357
00:00:01,357 X_02 (E_01) → M_02
00:00:01,357 X_01 (E_01) → M_01
00:00:01,357 X_01 (E_01) → M_01
00:00:01,357 X_04 (E_01) → M_04
00:00:01,404
00:00:01,404

◇送信 >>
00:00:01,404 - ----: 送信データ
00:00:01,404 - ----: 20-02-00-05-0B-00-00-83-6D-03
00:00:01,404 - X_02 (E_06) → M_01
00:00:01,419 -

-----------------------------------------------------------------------


・Rich boxに表示させたいのは下のような感じです。


◇受信 <<
00:00:01,357 - ----: 受信データ
00:00:01,357 - ----: 00-02-00-06-0B-01-00-82-FF-6D-03-00
◇送信 >>
00:00:01,404 - ----: 送信データ
00:00:01,404 - ----: 20-02-00-05-0B-00-00-83-6D-03


ご質問ありがとうございます。








引用返信 編集キー/
■81992 / inTopicNo.4)  Re[3]: テキストファイルから特定のキーワードを3行分表示させる
□投稿者/ Azulean (739回)-(2016/11/27(Sun) 21:28:46)
No81991 (初心者中の初心者 さん) に返信
>>Q1.たとえば、「キーワードを含む1行」であれば実現できますか?
> A1.調べたのですが、初心者であまり分かりませんでした。

String クラスのページでメソッド一覧を眺めてください。
https://msdn.microsoft.com/ja-jp/library/system.string

知らない内は、クラスのメソッド・プロパティ一覧から探そうとする癖をつけてもらった方がいいと思います。
(キーワードは「部分文字列」)


> 読み込むテキストはこんな感じです。

だとすると、以下のように作れば良いでしょう。
(条件の部分は String クラスのメソッド一覧から考えてみてください)

・残り何行取り出すかの int 型の変数を作っておく。
・条件を満たした場合、int 型の変数に連続で読み込みたい行数である 2 を入れつつ、その行を Add する。
・int 型の変数が 1 以上の場合、その行を Add しつつ、int 型変数を 1 減らす。
・条件を満たさず、int 型変数も 0 の場合はその行を飛ばす。

引用返信 編集キー/
■81993 / inTopicNo.5)  Re[4]: テキストファイルから特定のキーワードを3行分表示させる
□投稿者/ 初心者中の初心者 (6回)-(2016/11/27(Sun) 22:19:36)
No81992 (Azulean さん) に返信
プログラムのやり方を教えていただきありがとうございます。頑張ってみます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -