可能重复:
Performing a subtotal on filtered data from a streamreader
数据集:“file.dat”中的数百行数据,每行数据的长度为80-500个ASCII字符。
位于每个字符串中的特定位置(固定宽度未分隔)是4个相关的信息。
1)-NUMBERS-始终位于每个字符串的前3个字符中,是一个数字,表示字符串是否与我相关。如果它包含210,310或410中的任何一个,那么我想处理这一行,否则我想忽略它。
2)-LETTERS-此信息的位置取决于前3个数字是210,310还是410.如果是210,那么我希望算法查看位置406中包含的值(总是字母) -409。如果前三个数字是310,那么我需要322-325的值,如果是410,那么我需要的是478-481。
3& 4)-NUMBERS-最后2条信息是数字,其中一条总是0,另一条将是> 0.鉴于我不知道哪个是非零,我希望将它们加在一起。这些数字位于以下位置:
FIRST NUMBER LOCATION SECOND NUMBER LOCATION 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"
等。对于数字和字母的所有组合(最多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.
}
}
}
}
答案 0 :(得分:0)
我写了一个班,他的工作是处理特定类型的行并汇总所有总和:
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; } }
}
然后你可以创建一个这些字典来帮助为每一行选择合适的字典(仔细检查我的长度是正确的):
Dictionary<string, LineHandler> handlers = new Dictionary<string, LineHandler> {
{ "210", new LineHandler(406, 3, 129, 11, 142, 11) },
{ "310", new LineHandler(322, 3, 113, 11, 126, 11) },
{ "410", new LineHandler(478, 3, 113, 11, 126, 11) } };
public Dictionary<string, int> Sums { get { return sums; } }
}
然后你可以循环你的行并“处理”每一行,如果它有一个处理程序:
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]);
}