逐行分析并存储if条件,否则忽略

时间:2012-11-29 10:27:05

标签: c# filter streamreader

我在这一个上挖了很多,并没有发现我正在寻找的。

INPUT:多行(数百,偶尔数千)ASCII文本行,范围从97个字符到500个以上。我是否要保留此数据的标准纯粹包含在前3个字符中(总是数字 - 任意值100,200和300是我感兴趣的)。

所需的输出只是那些以100,200或300开头的输出,其余的我可以忽略。

这就是我的streamreader,它当前输出到控制台:

using System;
using System.Collections.Generic;
using System.IO;

class Program
{
public void Do
{

    // 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)
        {
            list.Add(line); // Add to list.
            Console.WriteLine(line); // Write to console.
        //    Console.ReadLine();
        }
    }
}
}

我希望列出一句话

IF {
FIRST3CHAR != (100,200,300) }
then skip,

但我不确定如何定义FIRST3CHAR类。这是将对原始数据执行的唯一过滤器。

接下来,我将根据其中包含的其他标准分析这个过滤后的数据集,但在请求任何帮助之前,我会自己给出一个镜头。

3 个答案:

答案 0 :(得分:5)

此代码更具可读性,可以满足您的需求:

var allowedNumbers = new[]{ "100", "200", "300" };
IEnumerable<String> lines = File
                   .ReadLines("File.dat")
                   .Where(l => allowedNumbers.Any(num => l.StartsWith(num)));

现在您可以枚举这些行,例如使用foreach

foreach(string line in lines)
{
    Console.WriteLine(line); // Write to console.
}

由于您要将这些行添加到List<string>,您可以使用Enumerable.ToList代替foreach

List<string> list = lines.ToList();

答案 1 :(得分:2)

最简单的一级:

if(line.StartsWith("100") || line.StartsWith("200") || line.StartsWith("300"))
{
    list.Add(line); // Add to list.
    Console.WriteLine(line); // Write to console.
}

如果文件很大(如数十万行),那么将它作为迭代器块实现也可能是值得的。但是“开始”测试非常简单。

如果你需要更多的灵活性,我会考虑一个正则表达式;例如:

static readonly Regex re = new Regex("^[012]00", RegexOptions.Compiled);

...
while (...)
{
    if(re.IsMatch(line))
    {
        list.Add(line); // Add to list.
        Console.WriteLine(line); // Write to console.
    }
}

答案 2 :(得分:1)

您是否有理由不将此条件添加到循环中?

while ((line = reader.ReadLine()) != null)
{
    var beginning = line.Substring(0, 3);
    if(beginning != "100" && beginning != "200" && beginning != "300")
        continue;
    list.Add(line); // Add to list.
    Console.WriteLine(line); // Write to console.
}