【问题标题】:Counting names in CSV files计算 CSV 文件中的名称
【发布时间】:2015-10-12 03:23:54
【问题描述】:

我正在尝试为一个学校项目编写一个程序,该程序将读取每行包含一个名称的 csv 文件,并输出每个名称及其在列表框中出现的次数。我不希望它预先设置为特定名称,但我想这也可以。到目前为止,我有这个,但现在我被困住了。 CSV 文件的每一行都有一个名称,并且每个名称后都有一个逗号。任何帮助都会非常感谢。

这是我目前所拥有的:

string[] csvArray;
string line;
StreamReader reader;
OpenFileDialog openFileDialog = new OpenFileDialog();

//set filter for dialog control
const string FILTER = "CSV Files|*.csv|All Files|*.*";
openFileDialog.Filter = FILTER;

//if user opens file and clicks ok
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
    //open input file
    reader = File.OpenText(openFileDialog.FileName);

    //while not end of stream
    while (!reader.EndOfStream)
    {
        //read line from file
        line = reader.ReadLine().ToLower();

        //split values
        csvArray = line.Split(',');

【问题讨论】:

    标签: c# loops csv iteration counting


    【解决方案1】:

    使用 Linq 我们可以做到以下几点:

    static IEnumerable<Tuple<int,string>> CountOccurences(IEnumerable<string> data)
    {
        return data.GroupBy(t => t).Select(t => Tuple.Create(t.Count(),t.Key));     
    }
    

    测试:

    var strings = new List<string>();
    strings.Add("John");
    strings.Add("John");
    strings.Add("John");
    strings.Add("Peter");
    strings.Add("Doe");
    strings.Add("Doe");
    foreach (var item in CountOccurences(strings)) {
        Console.WriteLine (String.Format("{0} = {1}", item.Item2, item.Item1));
    }
    

    约翰 = 3 彼得 = 1 能源部 = 2

    在您的情况下使用:

    string filePath = "c:\myfile.txt"
    foreach (var item in CountOccurences(File.ReadAllLines(filePath).Select(t => t.Split(',').First())))
        Console.WriteLine (String.Format("{0} = {1}", item.Item2, item.Item1));
    

    【讨论】:

      【解决方案2】:

      您可以使用字典,在其中存储每个名称的出现:

      Dictionary<string,int> NameOcur=new Dictionary<string,int>();
      ...
       while (!reader.EndOfStream)
          {
              //read line from file
              line = reader.ReadLine().ToLower();
      
              //split values
              csvArray = line.Split(',');
              if (NameOcur.ContainsKey(csvArray[0]))
              {
                ///Name exists in Dictionary increase count
                 NameOcur[csvArray[0]]++;
              }
              else
              {
                //Does not exist add with value 1
                 NameOcur.Add(csvArray[0],1);
              }
           }
      

      【讨论】:

        猜你喜欢
        • 2014-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-05
        相关资源
        最近更新 更多