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

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

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

Re[35]: ReadLineで読み込んだ文字列の検索 [3]


(過去ログ 66 を表示中)

[トピック内 94 記事 (61 - 80 表示)]  << 0 | 1 | 2 | 3 | 4 >>

■38230 / inTopicNo.61)  Re[32]: ReadLineで読み込んだ文字列の検索
  
□投稿者/ επιστημη (2042回)-(2009/07/09(Thu) 15:03:15)
επιστημη さんの Web サイト
> で、検索する単語を一つにまとめるにはどうすればよいのでしょうか?
> subっをそのまま検索する単語としてできるのでしょうか???

「ひとつにまとめる」とは、具体的にどうしたいのですか?
まぜ、「ひとつにまとめる」必要があると思ったのですか?

foreach ( string sub in ... ) によって得られる sub を対象文字列から検索し、
見つかれば"成功"として検索終了、ひとつも見つからなければ"失敗"として検索終了ですよね?


引用返信 編集キー/
■38231 / inTopicNo.62)  Re[32]: ReadLineで読み込んだ文字列の検索
□投稿者/ Axolotl (38回)-(2009/07/09(Thu) 15:06:34)
Axolotl さんの Web サイト
言葉足らずで本当に申し訳ありません。


> 1. たとえば 検索パターンが "かもしか" であったとき、マッチを試みる部分文字列は:
> "かもし", "もしか", ”かもしか" の三つですね?
はい。3文字以上の連続した文字です。
>
> 2. なるべく長い部分文字列のマッチを見つけたいのだから、試みる順番を
>   ”かもしか", "かもし", "もしか" の順とし、マッチし次第検索を終了していいですね?
はい。なるべく長い順番から見つけていきたいです。
>
> 3. ファイルから読んだ各行が
>    りんご
>   くだもの
>    もしかして
>    仮定
>   であるとします。このとき、"かもしか"とのマッチを試みるのは"りんご"と"もしかして"ですね?
はい。奇数行は「りんご」と「もしかして」です。
>
> 4. (3)の条件下で出力されるのは"仮定"ですね?
はい。「もしかして」がマッチするので、「仮定」が出力されます。
>
> 5. ひとつもマッチしないとき、なにを出力すればいいですか?
これらのプログラムは僕が行いたいプログラムの一部でして、他の部分は出来上がっており、ひとつもマッチしないときは別の操作を行うようになっています。
>
> 6. マッチするのが複数あったとき、なにを出力すればいいですか?
一番マッチする文字が長いものを出力し、さらにそれも重複するならばランダムで決めます。


2と6はできれば・・・の範囲です。なにしろそれ以前に苦労しているので・・・。

よろしくお願いします。
引用返信 編集キー/
■38232 / inTopicNo.63)  Re[33]: ReadLineで読み込んだ文字列の検索
□投稿者/ Axolotl (39回)-(2009/07/09(Thu) 15:10:34)
Axolotl さんの Web サイト
一つにまとめる・・・というのは、何度もくりかえし同じソースを書くのではなく、「sub」で検索できるのでしょうか、というのことです。
要は、「sub」で検索すれば「sub」で出力された全ての文字が検索される?ということです。

多分(subが行ごとに出力されている形であれば)「sub」の行ごとに調べるのがいいと思いますが・・・。

subはどのような形で出力されているのかよくわからないので・・・。

よろしくお願いします。
引用返信 編集キー/
■38233 / inTopicNo.64)  Re[34]: ReadLineで読み込んだ文字列の検索
□投稿者/ επιστημη (2043回)-(2009/07/09(Thu) 15:20:06)
επιστημη さんの Web サイト
↓動かしてみそ。あなたのやりたいことの70%を満足しているはず。

using System;
using System.Collections.Generic;

class Program {

  // 候補となる部分文字列を長いものから列挙する
  public static IEnumerable<string> SubStrings(string source, int min_len) {
    for ( int len = source.Length; len >= min_len; --len ) {
      for ( int pos = 0; pos <= source.Length - len; ++pos ) {
        yield return source.Substring(pos,len);
      }
    }
  }

  // patternから列挙される部分文字列を targetが含むなら true を返す
  public static bool match(string target, string pattern) {
    foreach ( string sub in SubStrings(pattern,3) ) {
      if ( target.IndexOf(sub) >= 0 ) return true;
    }
    return false;
  }

  public static void Main() {
    string[] lines = {
      "うしかもしか", "ヌー",
      "かもしか",     "ウシ科",
      "かも",         "鳥類",
      "もしかしたら", "仮定",
      "りんご",       "果物",
      };
    string pattern = "かもしか";
    // 偶数番の文字列と"かもしか"をマッチさせる。
    // マッチしたら次行(奇数番)をプリントする。
    for ( int i = 0; i < lines.Length; i += 2 ) {
      if ( match(lines[i], pattern) ) {
        Console.WriteLine(lines[i+1]);
      }
    }
  }
}

引用返信 編集キー/
■38234 / inTopicNo.65)  Re[35]: ReadLineで読み込んだ文字列の検索
□投稿者/ Axolotl (40回)-(2009/07/09(Thu) 15:45:19)
Axolotl さんの Web サイト
ありがとうございます!

System.IO.File.ReadAllLines(@"C:\A.txt",
System.Text.Encoding.GetEncoding("Shift_JIS"));
にlinesを変えることで、textファイルの読み込みからできました。
本当にすごいですね・・・。

この書いていただいたソースをwindowsアプリの
private void button1_Click(object sender, EventArgs e)
{
//ここ
}
に入れるにはどうすればよいのでしょうか?
コンソールアプリのソースをあまり扱ったことがないのでよくわかりません。お願いします。

引用返信 編集キー/
■38235 / inTopicNo.66)  Re[36]: ReadLineで読み込んだ文字列の検索
□投稿者/ επιστημη (2044回)-(2009/07/09(Thu) 15:55:53)
επιστημη さんの Web サイト
> private void button1_Click(object sender, EventArgs e)
> {
> //ここ
> }
> に入れるにはどうすればよいのでしょうか?

private void button1_Click(object sender, EventArgs e)
{
    string[] lines = ファイルから読む
    string pattern = 検索パターンを突っ込む
    for ( int i = 0; i < lines.Length; i += 2 ) {
      if ( match(lines[i], pattern) ) {
        // Console.WriteLine(lines[i+1]);
        みつかったときになんかする
      }
    }
}

※ Substrings と match はまるっとコピればよろし。

引用返信 編集キー/
■38236 / inTopicNo.67)  Re[37]: ReadLineで読み込んだ文字列の検索
□投稿者/ Axolotl (41回)-(2009/07/09(Thu) 16:17:45)
Axolotl さんの Web サイト
ありがとうございます。

>Substrings と match はまるっとコピればよろし。
publicも入れるのですか?

なんかエラーが20個くらいでてしまって。。。

非常に初歩的な質問ですみません。

引用返信 編集キー/
■38237 / inTopicNo.68)  Re[38]: ReadLineで読み込んだ文字列の検索
□投稿者/ すがり (53回)-(2009/07/09(Thu) 16:23:09)
using System;
using System.Collections.Generic;
using System.Windows.Forms;

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

private void button1_Click(object sender, EventArgs e) {
string[] lines = {
"うしかもしか", "ヌー",
"かもしか", "ウシ科",
"かも", "鳥類",
"もしかしたら", "仮定",
"りんご", "果物",
};
string pattern = "かもしか";
// 偶数番の文字列と"かもしか"をマッチさせる。
// マッチしたら次行(奇数番)をプリントする。
for (int i = 0; i < lines.Length; i += 2) {
if (match(lines[i], pattern)) {
MessageBox.Show(lines[i + 1]);
}
}

}

// 候補となる部分文字列を長いものから列挙する
public static IEnumerable<string> SubStrings(string source, int min_len) {
for (int len = source.Length; len >= min_len; --len) {
for (int pos = 0; pos <= source.Length - len; ++pos) {
yield return source.Substring(pos, len);
}
}
}

// patternから列挙される部分文字列を targetが含むなら true を返す
public static bool match(string target, string pattern) {
foreach (string sub in SubStrings(pattern, 3)) {
if (target.IndexOf(sub) >= 0) return true;
}
return false;
}

}
}

フォーム、ボタンは環境に合わせてください。
※説明どおりにコピペで動きましたよ。
引用返信 編集キー/
■38238 / inTopicNo.69)  Re[39]: ReadLineで読み込んだ文字列の検索
□投稿者/ すがり (54回)-(2009/07/09(Thu) 16:23:54)
しまった、図形モードにし忘れ・・・
引用返信 編集キー/
■38239 / inTopicNo.70)  Re[38]: ReadLineで読み込んだ文字列の検索
□投稿者/ επιστημη (2045回)-(2009/07/09(Thu) 16:24:53)
επιστημη さんの Web サイト
> なんかエラーが20個くらいでてしまって。。。

どこにコピったんだろ。
Formの中にコピりましたか?

# Form(てかclass)の外だと怒られまくりますががが

引用返信 編集キー/
■38240 / inTopicNo.71)  Re[40]: ReadLineで読み込んだ文字列の検索
□投稿者/ Axolotl (42回)-(2009/07/09(Thu) 16:29:49)
Axolotl さんの Web サイト
面白い表現使いますね。。。

できました!ありがとうございます!
επιστημη さんはもちろん、他の方々にも時間を割いていただいて、本当にありがとうございました。

このアプリはここらで完成させて、もっと僕の腕が上達したらまたはじめようと思います。

他のアプリを製作するときに(今度はもっと簡単なやつ;;;)またお世話になるかもしれませんが、その節はよろしくお願いします。


最後に、本当にみなさんありがとうございました。
解決済み
引用返信 編集キー/
■38241 / inTopicNo.72)  Re[39]: ReadLineで読み込んだ文字列の検索
□投稿者/ .SHO (949回)-(2009/07/09(Thu) 16:32:32)
そしてここまで出来たら

>             // 偶数番の文字列と"かもしか"をマッチさせる。
>             // マッチしたら次行(奇数番)をプリントする。
>             for (int i = 0; i < lines.Length; i += 2) {
>                 if (match(lines[i], pattern)) {

ここで、pattern の長さをチェックして一番長い奴を保存しておき
複数あったら乱数で決める。
と、先は長いなぁ。。。

>                     MessageBox.Show(lines[i + 1]);
>                 }
>             }
> 
>         }

引用返信 編集キー/
■38242 / inTopicNo.73)  Re[40]: ReadLineで読み込んだ文字列の検索
□投稿者/ .SHO (950回)-(2009/07/09(Thu) 16:33:54)
しまった。終わってた。。。orz
解決済み
引用返信 編集キー/
■38243 / inTopicNo.74)  Re[40]: ReadLineで読み込んだ文字列の検索
□投稿者/ επιστημη (2046回)-(2009/07/09(Thu) 16:37:34)
επιστημη さんの Web サイト
> 先は長いなぁ。。。

マッチ候補は一回求めておいて使い回せばいいのに
検索のたんびに毎回二重loopで生成してるのもァレですねー。

# 宿題を残すため、ワザとほっとくεπιちゃんの底意地の悪さ。
# ってやつですね。わかります。

解決済み
引用返信 編集キー/
■38244 / inTopicNo.75)  Re[41]: ReadLineで読み込んだ文字列の検索
□投稿者/ Axolotl (43回)-(2009/07/09(Thu) 16:51:36)
Axolotl さんの Web サイト
っと・・・
すみません。。。
あのー、見つかんなかったときの操作はどこにいれればいいんですか?


引用返信 編集キー/
■38245 / inTopicNo.76)  Re[41]: ReadLineで読み込んだ文字列の検索
□投稿者/ .SHO (951回)-(2009/07/09(Thu) 16:53:43)
> マッチ候補は一回求めておいて使い回せばいいのに
> 検索のたんびに毎回二重loopで生成してるのもァレですねー。

もともとの質問が『まともにやったんじゃ遅いのはわかってるから
速い方法を教えて』だったから、ここ無駄だよなぁ〜とは思ってました。
(まぁ、途中からそれどころじゃなくなったけど…)

> # 宿題を残すため、ワザとほっとくεπιちゃんの底意地の悪さ。
> # ってやつですね。わかります。

# 意地悪だったのか・・・(笑)
# またごちゃごちゃして、混乱するだろうからほっといたのかと思った。
解決済み
引用返信 編集キー/
■38246 / inTopicNo.77)  Re[42]: ReadLineで読み込んだ文字列の検索
□投稿者/ .SHO (952回)-(2009/07/09(Thu) 16:55:19)
うわっ、解決済みいらなかったのか…orz
引用返信 編集キー/
■38247 / inTopicNo.78)  Re[42]: ReadLineで読み込んだ文字列の検索
□投稿者/ すがり (55回)-(2009/07/09(Thu) 16:55:22)
No38244 (Axolotl さん) に返信
> っと・・・
> すみません。。。
> あのー、見つかんなかったときの操作はどこにいれればいいんですか?
> 
> 

boolean boo = false;
for (int i = 0; i < lines.Length; i += 2) {
    if (match(lines[i], pattern)) {
        boo = true;
        MessageBox.Show(lines[i + 1]);
    }
}
if ( !boo ){
    MessageBox.Show("無いワァ");
}

動作未検証です。

引用返信 編集キー/
■38248 / inTopicNo.79)  Re[42]: ReadLineで読み込んだ文字列の検索
□投稿者/ επιστημη (2047回)-(2009/07/09(Thu) 16:56:24)
επιστημη さんの Web サイト
2009/07/09(Thu) 16:57:22 編集(投稿者)

> あのー、見つかんなかったときの操作はどこにいれればいいんですか?

そろそろ自分で考えましょう。
脳みそ膿むまで考えてわかんなかったら教えてあげる。

もらったもんコピるだけならサルでもできるべ

# お、遅かったーーっ orz

引用返信 編集キー/
■38249 / inTopicNo.80)  Re[43]: ReadLineで読み込んだ文字列の検索
 
□投稿者/ .SHO (953回)-(2009/07/09(Thu) 17:04:14)
> そろそろ自分で考えましょう。

# 同じ事書こうと思ってたら遅かった…

つか、なかった時の処理って、複数あった時の処理と併せて考えないと
スパゲッティになりそう。

だからbooleanよかintの方がよさげ。

引用返信 編集キー/

<前の20件 | 次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 | 4 >>

管理者用

- Child Tree -