Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串中提取特定数据,并根据字符串中其他位置包含的值求和_C# - Fatal编程技术网

C# 从字符串中提取特定数据,并根据字符串中其他位置包含的值求和

C# 从字符串中提取特定数据,并根据字符串中其他位置包含的值求和,c#,C#,可能重复: 数据集:“file.dat”中有数百行数据,每行的长度从80-500个ASCII字符不等 在每个字符串中的特定位置(固定宽度未分隔)有4条相关信息 1) -数字-始终位于每个字符串的前3个字符中,是一个数字,表示该字符串是否与我相关。如果它包含210310或410中的任何一个,那么我想处理这一行,否则我想忽略它 2) -字母-此信息的位置取决于前3位数字是210、310还是410。如果是210,那么我希望算法查看包含在位置406-409中的值(总是字母)。如果前3位是310,那么我

可能重复:

数据集:“file.dat”中有数百行数据,每行的长度从80-500个ASCII字符不等

在每个字符串中的特定位置(固定宽度未分隔)有4条相关信息

1) -数字-始终位于每个字符串的前3个字符中,是一个数字,表示该字符串是否与我相关。如果它包含210310或410中的任何一个,那么我想处理这一行,否则我想忽略它

2) -字母-此信息的位置取决于前3位数字是210、310还是410。如果是210,那么我希望算法查看包含在位置406-409中的值(总是字母)。如果前3位是310,那么我需要322-325的值,如果是410,那么我需要的是478-481

3和4)-数字-最后两条信息是数字,其中一条始终为0,另一条大于0。考虑到我无法判断哪个是非零,我希望将它们相加。这些号码位于以下位置:

FIRST NUMBER LOCATION SECOND NUMBER LOCATION 210: ......... 129-140 ......................................142-153 310: ..........113-124 ......................................126-137 410: ..........113-124 ......................................126-137 第一个号码位置第二个号码位置 210: ......... 129-140 ......................................142-153 310: ..........113-124 ......................................126-137 410: ..........113-124 ......................................126-137 我需要做的是提供2)中每个字母组合的小计。2)的值范围仅为4-5种不同的字母排列(ABCD、AAAA、BBBB、CCCC、DDDD),因此我的最终输出为:

210 AAAA "Total number" 210 BBBB "Total number" . . . 410 DDDD "Total number" 410 ABCD "Total number" 210 AAAA“总数” 210 BBBB“总数” . . . 410 DDDD“总数” 410 ABCD“总数” 对于所有数字和字母的组合(最多15个)

我希望这是清楚的,, 提前谢谢

编辑:当前代码:

我目前正在尝试使用一系列if和许多var,希望这段代码粘贴:

class Program
{
    static void Main()
    {
        // Read in a file line-by-line, and store in a List.
        List<string> list = new List<string>();
        using (StreamReader reader = new StreamReader("file.dat"))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                var beginning = line.Substring(0, 3);
                // building this up atm
                // var letters210 = line.Substring(129,11);
                if (beginning != "210" && beginning != "310" && beginning != "410")
                    continue;

                list.Add(line); // Add to list.
                Console.WriteLine(line); // Write to console.
            }
        }
    }
}
类程序
{
静态void Main()
{
//逐行读取文件,并存储在列表中。
列表=新列表();
使用(StreamReader=newstreamreader(“file.dat”))
{
弦线;
而((line=reader.ReadLine())!=null)
{
变量开始=行子字符串(0,3);
//建立自动取款机
//var letters210=行子串(129,11);
如果(开始!=“210”&开始!=“310”&开始!=“410”)
继续;
添加(行);//添加到列表。
Console.WriteLine(行);//写入控制台。
}
}
}
}

我将编写一个类,其任务是处理特定类型的行并聚合所有的总和:

public class LineHandler
{
    // Start indices and lengths for string and two numbers
    int si, sl, n1i, n1l, n2i, n2l;
    Dictionary<string, int> sums;

    public LineHandler(int si, int sl, int n1i, int n1l, int n2i, int n2l)
    {
        this.si = si; this.sl = sl; this.n1i = n1i;
        this.n1l = n1l; this.n2i = n2i; this.n2l = n2l;
        sums = new Dictionary<string,int>();
    }

    public void HandleString(string s)
    {
        string key = s.Substring(si, sl);
        int sum = int.Parse(s.Substring(n1i, n1l)) + int.Parse(s.Substring(n2i, n2l));
        if (sums.ContainsKey(key))
            sums[key] += sum;
        else
            sums[key] = sum;
    }

    public Dictionary<string, int> Sums { get { return sums; } }
}
然后您可以访问以下值:

foreach(string key in handlers.Keys)
{
    LineHandler handler = handlers[key];
    foreach (string s in handler.Sums.Keys)
        Console.WriteLine("{0} {1} {2}", key, s, handler.Sums[s]);
}

你为什么不使用数据库呢?拼命想找到解决方案。我之前的问题有一个向上投票的答案(在编辑之前),所以被视为已回答,因为我把情况简化了太多。编辑-不使用数据库,因为我没有软件:(这将是一个更简单的解决方案。您现在有什么代码?您有C#而不是SQL Server CE?尝试从
if!line.StartsWith(“210”)开始)&&&
等。非常感谢罗琳,他将查看此内容,并通过谷歌尝试了解Linehandler。如果可以的话,我会投票。也许有一天我会达到这么高的水平。:)
while ((line = reader.ReadLine()) != null)
{
    string key = line.Substring(0, 3);
    if (handlers.ContainsKey(key))
        handlers[key].HandleString(line);
}
foreach(string key in handlers.Keys)
{
    LineHandler handler = handlers[key];
    foreach (string s in handler.Sums.Keys)
        Console.WriteLine("{0} {1} {2}", key, s, handler.Sums[s]);
}