2009-10-03 94 views
4

对于我正在做的项目,我必须做的一件事是删除明文文件的第一行X行。我说的是X,因为我需要多次执行此例程,每次删除的行都会不同,但它们总是从头开始,删除第一行,然后将结果输出到同一个文件。如何删除文本文件的第一个“X”行?

我想到做这样的事情,这是我从其他的教程和例子,我读拼凑:

String line = null; 

String tempFile = Path.GetTempFileName(); 
String filePath = openFileDialog.FileName; 

int line_number = 0; 
int lines_to_delete = 25; 

using (StreamReader reader = new StreamReader(originalFile)) { 
    using (StreamWriter writer = new StreamWriter(tempFile)) { 
     while ((line = reader.ReadLine()) != null) { 
      line_number++; 

      if (line_number <= lines_to_delete) 
       continue; 

      writer.WriteLine(line); 
     } 
    } 
} 

if (File.Exists(tempFile)) { 
    File.Delete(originalFile); 
    File.Move(tempFile, originalFile); 
} 

但我不知道这是否会因为像行号的小东东工作从第0行开始或者什么都不...也不知道在效率和形式方面它是否是好代码。

非常感谢。

回答

6

没关系,看起来不会有你害怕的错误问题。然而,更精简的方法将由两个独立的循环提供 - 一个只计算来自输入文件的第一个X行(并且别无其他),另一个只是将其他行从输入复制到输出。即的,而不是单一while循环,有...:

while ((line = reader.ReadLine()) != null) { 
     line_number++; 

     if (line_number > lines_to_delete) 
      break; 
    } 

    while ((line = reader.ReadLine()) != null) { 
     writer.WriteLine(line); 
    } 
+0

这工作,因为当我再次做reader.ReadLine(),将恢复从阅读离开的地方,对不对? 如果我想让另一个阅读器称为“阅读器”(因为这将在一个更大的循环中重复这个过程多次),我只需要关闭“阅读器”,然后当我做出另一个时,它会开始从文件开始回来,对吗? – ankushg 2009-10-03 23:37:40

+0

@Unk,这是对这个评论中的两个问题。 – 2009-10-04 01:12:46

+0

非常感谢! – ankushg 2009-10-04 01:23:12

0

你可以文件读入到线的阵列,忽略了最初的几个要素,剩下的回信。

这种方法的缺点是它会占用内存中文件的大小。你的方法(虽然相当不可读,没有进攻)没有这个记忆问题。虽然文件不是太大,但不应该担心内存使用的问题。

例子:

string[] lines = System.IO.File.ReadAllLines("YourFile.txt").Skip(10).ToArray(); 
System.IO.File.WriteAllLines("OutFile.txt", lines); 
+0

是的,主要的问题是该文件是非常大的,程序运行的计算机不完全是顶尖的。我已经在使用一堆数组来处理数据,所以这就是为什么我使用我的方法去做的原因;阅读并当场写作。 感谢您的帮助,反正。 – ankushg 2009-10-03 23:29:52

+0

糟糕,我的不好,忘了ToArray() – 2009-10-03 23:33:47

8

我喜欢短...

File.WriteAllLines(
    fileName, 
    File.ReadAllLines(fileName).Skip(numberLinesToSkip).ToArray()); 
+0

干净的解决方案。由于它将整个文件读入内存,所以如果源文件太大,会引起问题。 – LukeH 2009-10-03 23:36:46

+0

是啊,这是真正的清洁,但正如我在查理的文章中提到,该文件是非常大,这个应用程序将不是一个强大的机器上运行... 谢谢您的好意;我不知道你使用过的所有这些方法,并且我学到了一些新的东西! – ankushg 2009-10-03 23:39:17

2

我喜欢你的方法,我认为没有错。如果你确定他们是小文件,那么其他建议可能会少一些代码,如果这对你很重要。

A的你已经有稍微少详细的版本:

using (StreamReader reader = new StreamReader(originalFile)) 
using (StreamWriter writer = new StreamWriter(tempFile)) 
{ 
    while(lines_to_delete-- > 0) 
     reader.ReadLine(); 
    while ((line = reader.ReadLine()) != null) 
     writer.WriteLine(line); 
} 
+0

感谢您的贡献! – ankushg 2009-10-04 01:27:43

相关问题