我在这一个上挖了很多,并没有发现我正在寻找的。
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类。这是将对原始数据执行的唯一过滤器。
接下来,我将根据其中包含的其他标准分析这个过滤后的数据集,但在请求任何帮助之前,我会自己给出一个镜头。
答案 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.
}