-3

私は次のようなファイルを持っています

outlook temperature Humidity  Windy  PlayTennis
sunny      hot        high     false   N
sunny      hot        high     true    N
overcast   hot        high     false   P
rain       mild       high     false   P
rain       cool       normal   false   P
rain       cool       normal   true    N

各要素の発生を見つけたい。例:晴れ:2雨:3曇り:1暑い:3など

私のコードは次のとおりです。

    string file = openFileDialog1.FileName;
    var text1 = File.ReadAllLines(file);
    StringBuilder str = new StringBuilder();

    string[] lines = File.ReadAllLines(file);

    string[] nonempty=lines.Where(s => s.Trim(' ')!="")
              .Select(s => Regex.Replace(s, @"\s+", " ")).ToArray();       

    string[] colheader = null;       

    if (nonempty.Length > 0)
        colheader = nonempty[0].Split();
    else
        return;

    var linevalue = nonempty.Skip(1).Select(l => l.Split());
    int colcount = colheader.Length;

    Dictionary<string, string> colvalue = new Dictionary<string, string>();
    for (int i = 0; i < colcount; i++)
    {
        int k = 0;
        foreach (string[] values in linevalue)
        {               
            if(! colvalue.ContainsKey(values[i]))
            {
                colvalue.Add(values[i],colheader[i]);                    
            }

         label2.Text = label2.Text + k.ToString();
        }           
    }

    foreach (KeyValuePair<string, string> pair in colvalue)
    {
        label1.Text += pair.Key+ "\n";
    }

ここで得られる出力は晴れの曇り雨暑い穏やかな涼しいNP真偽

また、入手できない出来事を見つけたいと思います。ここで私を助けてくれませんか。

4

3 に答える 3

1

このLINQクエリはDictionary<string, int>、ファイル内の各単語をキーとして、単語の出現を値として含むものを返します。

var occurences = File.ReadAllLines(file).Skip(1) // skip titles line
    .SelectMany(l => l.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries))
    .GroupBy(w => w)
    .ToDictionary(g => g.Key, g => g.Count());

辞書の使い方:

int sunnyOccurences = occurences["sunny"];

foreach(var pair in occurences)
    label1.Text += String.Format("{0}: {1}\n", pair.Key, pair.Value);
于 2013-02-25T20:01:45.840 に答える
0

シンプルなタグ クラウドを実装しているように思えます。非ジェネリック コレクションを使用しましたが、ジェネリックに置き換えることができます。HashTableを次のコードに置き換えDictionary ます。

            Hashtable tagCloud = new Hashtable();
            ArrayList frequency = new ArrayList();

ファイルから読み取り、配列として保存します

 string[] lines = File.ReadAllLines("file.txt");
            //use the specific delimiter
            char[] delimiter = new char[] { ' ' };
            StringBuilder buffer = new StringBuilder();
            foreach (string line in lines)
            {
                if (line.ToString().Length != 0)
                {
                    buffer.Append((" " + line.Trim()));
                }
            }
            string[] words = buffer.ToString().Trim().Split(delimiter);

各単語の出現を保存します。

  List<string> listOfWords = new List<string>(words);
            foreach (string i in listOfWords)
            {
                int c = 0;
                foreach (string j in words)
                {
                    if (i.Equals(j))
                        c++;
                }
                frequency.Add(c);
            }

キーと値のペアとして保存します。値は単語になり、キーはその出現になります

            for (int i = 0; i < listOfWords.Count; i++)
            {
                //use dictionary here
                tagCloud.Add(listOfWords[i], (int)frequency[i]);
            }
于 2013-02-25T20:10:51.760 に答える
0

必要なのはキーワードと、ファイルに出現する回数のカウントだけである場合、lazyberezovsky のソリューションは、あなたが見つけるのと同じくらいエレガントなソリューションです。ただし、ファイルのデータに対して他のメトリックを実行する必要がある場合は、他のメタデータをそのまま保持するコレクションにファイルをロードします。

次のような簡単なもの:

var forecasts = File.ReadAllLines(file).Skip(1) // skip the header row
    .Select(line => line.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries)) // split the line into an array of strings
    .Select (f =>
    new
    {
        Outlook = f[0],
        Temperature = f[1],
        Humidity = f[2],
        Windy = f[3],
        PlayTennis = f[4]
    });  

IEnumerable<>クエリ可能なプロパティを持つ匿名型の を提供します。

たとえば、Outlook で "sunny" が発生した回数を確認したい場合は、LINQ を使用してこれを行うことができます。

var count = forecasts.Count( f => f.Outlook == "sunny");

または、すべての見通しのリストが必要な場合は、次のように記述できます。

var outlooks = forecasts.Select(f => f.Outlook).Distinct();

これが役立つのは、「雨の涼しい日は何日ありますか?」のような、より複雑なクエリを実行したい場合です。

var count = forecasts.Count (f => f.Outlook == "rain" && f.Temperature == "cool");

繰り返しますが、すべての単語とその出現回数だけが必要な場合、これはやり過ぎです。

于 2013-02-25T21:01:48.623 に答える