我正在寻找的东西是这样的:
var f = UsefulFileObject(@"c:\temp.log");
f.ForEachLine( (line) => line.Trim() );
Run Code Online (Sandbox Code Playgroud)
之后,我希望修剪文件中的每一行.
框架中是否已存在此类对象,还是应该开始创建自己的对象?
看到使用几种错误的解决方案后,ForEach在一个不变的类型,例如string,我想我会后我自己.
这实际上是读写所提到的文件.尽管如此,它只适用于小文件,因为整个内容都在内存中*.
string filename = @"C:\testfile.txt";
string[] fileLines = File.ReadAllLines(filename);
fileLines = Array.ConvertAll(fileLines, l => l.Trim());
File.WriteAllLines(filename, fileLines);
Run Code Online (Sandbox Code Playgroud)
在现实世界中,您可能希望首先写入不同的文件,并在操作成功后将其重命名为原始文件.否则如果在写中途出错的话,部分文件可能会丢失.
广告内存使用情况:
实际上,文件会在内存中暂时两次.您可以通过使用常规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
Run Code Online (Sandbox Code Playgroud)
实现"ForEachLine":
如果你想实现一个你所描述的帮助器方法,你可以在那里隐藏丑陋的重命名逻辑.
方法签名类似于:
public void ForEachLine(Func<string, string> func)
Run Code Online (Sandbox Code Playgroud)
而写作的那一行就是:
writer.WriteLine(func(line));
Run Code Online (Sandbox Code Playgroud)