如何计算包含多个分隔符的文件中存储的数字的出现次数

本文关键字:存储 文件 数字 分隔符 何计算 计算 包含多 | 更新日期: 2023-09-27 18:08:26

这是我在文件中的输入存储:

50|Carbon|Mercury|P:4;P:00;P:1
90|Oxygen|Mars|P:10;P:4;P:00
90|Serium|Jupiter|P:4;P:16;P:10
85|Hydrogen|Saturn|P:00;P:10;P:4

现在我将取我的第一行 p:4,然后下一个 p:00,然后下一个同样明智,并希望在每隔一行计算出现次数,因此预期输出将是:

p:4 3(查找于第二行,第三行,第四行(最后一个单元格))

2

p: 00 (发现第二行,第四行)

p:1 0(没有出现)

1

p: 10

p: 16 0

同样,我想打印每一个比例的出现次数。

到目前为止,我成功地将一行一行地分割并存储在我的类文件对象中,如下所示:

public class Planets
    {
       //My rest fields
        public string ProportionConcat { get; set; }
        public List<proportion> proportion { get; set; }
    }
    public class proportion
    {
        public int Number { get; set; } 
    }

我已经填充了我的行星对象如下最后我的行星对象数据列表是这样的:

List<Planets> Planets = new List<Planets>();
Planets[0]:
    {
       Number:50
       name: Carbon
       object:Mercury
       ProportionConcat:P:4;P:00;P:1
       proportion[0]:
                 {
                     Number:4
                 },
        proportion[1]:
                 {
                     Number:00
                 },
    proportion[2]:
                 {
                     Number:1
                 }
    }

等等…

我知道我可以循环并执行搜索和计数,但是需要2到3个循环,代码会有点混乱,所以我想要一些更好的代码来执行这个。

现在我如何搜索每个和计数每一个比例在我的行星列表对象??

如何计算包含多个分隔符的文件中存储的数字的出现次数

如果您已经解析过比例,那么您可以为输出数据创建新的结构:

// Class to storage result
public class Values
{
    public int Count;   // count of proportion entry.
    public readonly HashSet<int> Rows = new HashSet<int>();  //list with rows numbers.
    /// <summary> Add new proportion</summary>
    /// <param name="rowNumber">Number of row, where proportion entries</param>
    public void Increment(int rowNumber)
    {
        ++Count;    // increase count of proportions entries
        Rows.Add(rowNumber);   // add number of row, where proportion entry
    }
}

并使用此代码填充它。我不确定它是否"混乱",也不认为有必要用LINQ使代码复杂化。你觉得怎么样?

   var result = new Dictionary<int, Values>();   // create dictionary, where we will storage our results. keys is proportion. values - information about how often this proportion entries and rows, where this proportion entry
   for (var i = 0; i < Planets.Count; i++)   // we use for instead of foreach for finding row number. i == row number
   {
      var planet = Planets[i];
      foreach (var proportion in planet.proportion)
      {
         if (!result.ContainsKey(proportion.Number))   // if our result dictionary doesn't contain proportion
            result.Add(proportion.Number, new Values());  // we add it to dictionary and initialize our result class for this proportion
         result[proportion.Number].Increment(i);  // increment count of entries and add row number
      }
   }

您可以使用var count = Regex.Matches(lineString, input).Count;。试试这个例子

var list = new List<string>
{
     "50|Carbon|Mercury|P:4;P:00;P:1",
     "90|Oxygen|Mars|P:10;P:4;P:00",
     "90|Serium|Jupiter|P:4;P:16;P:10",
     "85|Hydrogen|Saturn|P:00;P:10;P:4"
};
int totalCount;
var result = CountWords(list, "P:4", out totalCount);
Console.WriteLine("Total Found: {0}", totalCount);
foreach (var foundWords in result)
{
    Console.WriteLine(foundWords);
}
public class FoundWords
{
    public string LineNumber { get; set; }
    public int Found { get; set; }
}
private List<FoundWords> CountWords(List<string> words, string input, out int total)
{
    total = 0;
    int[] index = {0};
    var result = new List<FoundWords>();
    foreach (var f in words.Select(word => new FoundWords {Found = Regex.Matches(word, input).Count, LineNumber = "Line Number: " + index[0] + 1}))
    {
        result.Add(f);
        total += f.Found;
        index[0]++;
    }
    return result;
}

我在这里为您做了一个DotNetFiddle: https://dotnetfiddle.net/z9QwmD

string raw =
@"50|Carbon|Mercury|P:4;P:00;P:1
90|Oxygen|Mars|P:10;P:4;P:00
90|Serium|Jupiter|P:4;P:16;P:10
85|Hydrogen|Saturn|P:00;P:10;P:4";
string[] splits = raw.Split(
    new string[] { "|", ";", "'n" },
    StringSplitOptions.None
);
foreach (string p in splits.Where(s => s.ToUpper().StartsWith(("P:"))).Distinct())
{
    Console.WriteLine(
        string.Format("{0} - {1}",
            p,
            splits.Count(s => s.ToUpper() == p.ToUpper())
        )
    );
}

基本上,您可以使用.Split一次拆分多个分隔符,这非常简单。在那之后,一切都是肉汁:)。

显然,我的代码只是将结果输出到控制台,但这部分很容易更改。