C#,读取 CSV 以获取 2 列中的重复单元格值,计算某项出现的次数,将其加 1 并将其附加到字符串以进行数字递增

C#, Read CSV for repeated cell values in 2 columns, count how many times something appears, add 1 to it and append it to a string for number increment

基本上,我有一个友好的名称生成器,它由项目 Name_Project Build_ 组成,末尾的数字表示它是相同项目和构建的 3 个中的第 3 个。示例:这是我在 CSV 文件中的内容:末尾的数字不断递增计数行 +1。 项目名称,项目构建
丰田, 2007
丰田, 2007

Friendly name = Toyota_2007_01 > 其中 1 表示 Toyota 和 2007 在同一行中只出现一次。 再添加 1 个 Toyota 2007,将生成一个友好名称:Toyota_2007_02 其中 02 表示 csv 中有 2 个相同的 Toyota 2007,因此如果我添加下一个,它将为第 3 个条目附加 03

这是 csv 现在应该有的内容:

(csv Header)

项目名称、项目构建、友好名称。

丰田,2007,Toyota_2007_01。

丰田,2007,Toyota_2007_02

如果我在同一 csv 中的下一个可用行中添加不同的项目,

本田 2009

比代码应该发现“同一行”中的本田和 2009 只出现一次,因此友好名称应该是 Honda_2009_01...

我的代码已经生成了直到“build year”的友好名称,但我希望它实际上进入 csv,阅读它并找出项目名称和构建年份出现在同一行并计数的时间,而不是添加1 根据文件中这些东西的数量在末尾附加该数字。

这是目前为止的代码。

上面的一些代码... { // 计算 CSV 文件中的行数 // 此方法计算文件中跳过 header 行的行数,为变量赋值,下一个条目递增 1

        using (StreamWriter sw = new StreamWriter(path, true)) // true for appending data to file, false to overwrite in file
        {
            if (headerLine)
            {
                sw.WriteLine(header);
                sw.WriteLine(string.Format(projectName + "," + projetcBuild.ToString() + "," + projectSN.ToString()));
            }
            else if (File.Exists(path))
            {
                sw.WriteLine(string.Format(projectName + "," + projetcBuild.ToString() + "," + projectSN.ToString()));
            }
            
        }



        int counter = 0;
        string line;

        StreamReader file = new StreamReader(@"C:\LOG.csv");
        string headerLine = file.ReadLine();
        while ((line = file.ReadLine()) != null)
        {
            counter++;
        }
        string FreindlyName = ProjectName_TextBox.Text + "_" + ProjectBuild_TextBox.Text + "_" + counter;
        file.Close();

CSV应该有,这个

我希望我没有过度解释这一点。提前致谢。

首先,我注意到您的计数器完全错误。我刚刚修好了你的柜台希望这能解决你的问题。

    string line;
    StreamReader file = new StreamReader(@"C:\LOG.csv");
    string headerLine = file.ReadLine() ;
    
    var counter = new List<string>();
    while (!string.IsNullOrWhiteSpace( (line = file.ReadLine()) ))
    {
        var cells = line.Split(','); // use your seprator => ,  |
        var projectFullName = $"{cells[0]}_{cells[1]}"; // eg Toyota_2007
        counter.Add(projectFullName);
    }
    var newName = ProjectName_TextBox.Text + "_" + ProjectBuild_TextBox.Text
    var newCount = counter.Where(q=> q == newName).Count() + 1;

    string freindlyName = $"{newName}_{newCount.ToString("00")}"; // freindlyName with correct number
    file.Close();

更新:

更好的计数器。

只需将此函数添加到您的代码中并使用它来获取正确的记录数。

public int CountFromLogFile(string projectName, string projectBuild, char seprator ,string csvPath)
{
    var isHeader = true;
    var counterDic = new Dictionary<string,int>();
    foreach (var line in File.ReadLines(csvPath))
    {
        if (isHeader)
        {
            isHeader = false;
            continue;
        }
        var cells = line.Split(seprator); // 0 => projectName & 1 => projectBuild
        var fName = $"{cells[0]}_{cells[1]}";
        if (counterDic.ContainsKey(fName))
            counterDic[fName]++;
        else
            counterDic.Add(fName,0);
    }
    var qName = $"{projectName}_{projectBuild}";
    return counterDic.ContainsKey(qName) ? counterDic[qName] : 0 ;
}

用法:

var count = CountFromLogFile(ProjectName_TextBox.Text , ProjectBuild_TextBox.Text , ',' , @"C:\LOG.csv");