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");
基本上,我有一个友好的名称生成器,它由项目 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");