2

我在这个上挖了很多,但没有找到我正在寻找的东西。

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

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

这就是我的流式阅读器,目前输出到控制台:

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 类。这是将对原始数据执行的唯一过滤器。

之后,我将根据其中包含的其他标准分析这个过滤后的数据集,但在寻求任何帮助之前,我会自己试一试。

4

3 回答 3

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.
}

由于您想将这些行添加到 aList<string>中,您可以使用Enumerable.ToList而不是foreach

List<string> list = lines.ToList();
于 2012-11-29T10:34:03.457 回答
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.
    }
}
于 2012-11-29T10:31:09.987 回答
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.
}
于 2012-11-29T10:30:53.390 回答