gpt4 book ai didi

c# - C#逐行读取文件

转载 作者:IT王子 更新时间:2023-10-29 03:46:48 26 4
gpt4 key购买 nike

我正在尝试读取一些文本文件,其中每一行都需要处理。目前我只是使用 StreamReader,然后单独读取每一行。

我想知道是否有更有效的方法(在 LoC 和可读性方面)使用 LINQ 在不影响操作效率的情况下执行此操作。我看到的示例涉及将整个文件加载到内存中,然后对其进行处理。然而,在这种情况下,我认为这不会非常有效。在第一个示例中,文件最大可达 50k,而在第二个示例中,并非文件的所有行都需要读取(大小通常小于 10k)。

您可能会争辩说,现在这些小文件并不重要,但我相信这种方法会导致代码效率低下。

第一个例子:

// Open file
using(var file = System.IO.File.OpenText(_LstFilename))
{
// Read file
while (!file.EndOfStream)
{
String line = file.ReadLine();

// Ignore empty lines
if (line.Length > 0)
{
// Create addon
T addon = new T();
addon.Load(line, _BaseDir);

// Add to collection
collection.Add(addon);
}
}
}

第二个例子:

// Open file
using (var file = System.IO.File.OpenText(datFile))
{
// Compile regexs
Regex nameRegex = new Regex("IDENTIFY (.*)");

while (!file.EndOfStream)
{
String line = file.ReadLine();

// Check name
Match m = nameRegex.Match(line);
if (m.Success)
{
_Name = m.Groups[1].Value;

// Remove me when other values are read
break;
}
}
}

最佳答案

您可以使用迭代器 block 非常轻松地编写基于 LINQ 的行读取器:

static IEnumerable<SomeType> ReadFrom(string file) {
string line;
using(var reader = File.OpenText(file)) {
while((line = reader.ReadLine()) != null) {
SomeType newRecord = /* parse line */
yield return newRecord;
}
}
}

或者让 Jon 开心:

static IEnumerable<string> ReadFrom(string file) {
string line;
using(var reader = File.OpenText(file)) {
while((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
...
var typedSequence = from line in ReadFrom(path)
let record = ParseLine(line)
where record.Active // for example
select record.Key;

然后你有 ReadFrom(...) 作为一个没有缓冲的惰性评估序列,非常适合 Where 等。

请注意,如果您使用OrderBy 或标准的GroupBy,它必须在内存中缓冲数据;如果您需要分组和聚合,“PushLINQ”有一些花哨的代码允许您对数据执行聚合但丢弃它(无缓冲)。乔恩的解释is here .

关于c# - C#逐行读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com