line.Trim() ); 在那-6ren">
gpt4 book ai didi

c# - 是否有 C# 语言构造/框架对象将函数应用于文件的每一行?

转载 作者:行者123 更新时间:2023-11-30 19:34:38 25 4
gpt4 key购买 nike

我正在寻找的是这些方面的东西:

var f = UsefulFileObject(@"c:\temp.log");
f.ForEachLine( (line) => line.Trim() );

在那之后,我希望文件中的每一行都被修剪。

框架中是否已经有这样的对象,或者我应该开始制作自己的对象吗?

最佳答案

在看到几个在 不可变类型(例如 string)上使用 ForEach 的错误解决方案后,我想我会发布自己的解决方案。

这将实际读取和写入提到的文件。尽管如此,它仅适用于较小的文件,因为整个内容都将在内存中*。

string filename = @"C:\testfile.txt";
string[] fileLines = File.ReadAllLines(filename);
fileLines = Array.ConvertAll(fileLines, l => l.Trim());
File.WriteAllLines(filename, fileLines);

在现实世界中,您可能希望先写入不同的文件,然后在操作成功后将其重命名为原始文件。否则,如果中途出现问题,部分文件可能会丢失。

广告内存使用情况:
实际上,该文件将暂时两次 在内存中。您可以通过使用常规 for 循环而不是任何花哨的扩展方法和 lambda 表达式来解决这个问题。我将跳过该练习,直接转到对较大文件执行此操作的“正确”方法:

using (StreamReader reader = new StreamReader(@"D:\infile.txt"))
using (StreamWriter writer = new StreamWriter(@"D:\outfile.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
writer.WriteLine(line.Trim());
}
}

// Some File.Move(..) usage to rename the files

实现“ForEachLine”:
如果您想实现一个帮助器方法来执行您描述的操作,您可以在其中隐藏丑陋的重命名逻辑。

方法签名类似于:

public void ForEachLine(Func<string, string> func)

写的那一行就是:

writer.WriteLine(func(line));

关于c# - 是否有 C# 语言构造/框架对象将函数应用于文件的每一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1258810/

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