我有.txt的扩展与从第三方程序生成的日志文件,每次该文本文件的最后一个空白行一个简单的日志文本文件.
因此,我可以使用任何方法或代码来删除文本文件的最后一行吗?
日志文本文件的示例:
Sun Jul 22 2001 02:37:46,73882,...b,r/rrwxrwxrwx,0,0,516-128-3,C:/WINDOWS/Help/digiras.chm
Sun Jul 22 2001 02:44:18,10483,...b,r/rrwxrwxrwx,0,0,480-128-3,C:/WINDOWS/Help/cyycoins.chm
Sun Jul 22 2001 02:45:32,10743,...b,r/rrwxrwxrwx,0,0,482-128-3,C:/WINDOWS/Help/cyzcoins.chm
Sun Jul 22 2001 04:26:14,174020,...b,r/rrwxrwxrwx,0,0,798-128-3,C:/WINDOWS/system32/spool/drivers/color/kodak_dc.icm
Run Code Online (Sandbox Code Playgroud)
dec*_*one 21
怎么样的:
var lines = System.IO.File.ReadAllLines("...");
System.IO.File.WriteAllLines("...", lines.Take(lines.Length - 1).ToArray());
Run Code Online (Sandbox Code Playgroud)
说明:
从技术上讲,您不会从文件中删除一行.您读取文件的内容并将其写回,不包括要删除的内容.
这段代码的作用是将所有行读入一个数组,然后将这些行写回文件,只排除最后一行.(Take()方法(LINQ的一部分)采用指定的行数,在我们的例子中,长度为1).在这里,var lines可以读作String[] lines.
Mig*_*ell 10
使用此方法删除文件的最后一行:
public static void DeleteLastLine(string filepath)
{
List<string> lines = File.ReadAllLines(filepath).ToList();
File.WriteAllLines(filepath, lines.GetRange(0, lines.Count - 1).ToArray());
}
Run Code Online (Sandbox Code Playgroud)
编辑:已实现先前不存在的行变量,因此我更新了代码.
如果您想从文件中删除最后 N 行而不将所有行加载到内存中:
int numLastLinesToIgnore = 10;
string line = null;
Queue<string> deferredLines = new Queue<string>();
using (TextReader inputReader = new StreamReader(inputStream))
using (TextWriter outputReader = new StreamWriter(outputStream))
{
while ((line = inputReader.ReadLine()) != null)
{
if (deferredLines.Count() == numLastLinesToIgnore)
{
outputReader.WriteLine(deferredLines.Dequeue());
}
deferredLines.Enqueue(line);
}
// At this point, lines still in Queue get lost and won't be written
}
Run Code Online (Sandbox Code Playgroud)
发生的情况是,您缓冲队列中具有维度的每个新行numLastLinesToIgnore,并从其中弹出一行,仅当队列已满时才写入。您实际上预读了文件,并且可以numLastLinesToIgnore在到达文件末尾之前停止行,而无需提前知道总行数。
请注意,如果文本小于numLastLinesToIgnore,则结果为空。
我想出了它作为一个镜像解决方案: 从文本文件中删除特定行?
| 归档时间: |
|
| 查看次数: |
25495 次 |
| 最近记录: |