-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";
    }

我得到的输出是晴 阴雨 热 温和 凉爽 N P 真 假

我也想找到我无法得到的发生。你能帮我吗?

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

如果您想要的只是关键字和它们在文件中出现的次数,那么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 中出现了多少次“晴天”,那么您可以使用 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 回答
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 回答