【问题标题】:Removing the first line of a text file in C#在 C# 中删除文本文件的第一行
【发布时间】:2011-08-10 09:26:11
【问题描述】:

我目前可以使用以下方法删除文本文件的最后一行:

    var lines = System.IO.File.ReadAllLines("test.txt");
    System.IO.File.WriteAllLines("test.txt", lines.Take(lines.Length - 1).ToArray());

但是,如何才能删除文本文件的开头?

【问题讨论】:

  • 也许不是您正在寻找的答案,但是将代表第一行的字节替换为 NULL 怎么样?下次你可以 File.ReadAllLines 时,它会跳过所有初始的 NULL 字节

标签: c# .net windows


【解决方案1】:

你可以用lines.Skip代替lines.Take,比如:

var lines = File.ReadAllLines("test.txt");
File.WriteAllLines("test.txt", lines.Skip(1).ToArray());

尽管使用的技术(读取所有文本并将所有内容写回)效率非常低,但在开头截断。

关于高效方式:效率低下是因为需要将整个文件读入内存。另一种方法可以很容易地在流中查找并将流复制到另一个输出文件,删除原始文件,然后重命名旧文件。那将同样快,但消耗的内存要少得多。

最后截断文件要容易得多。您可以找到截断位置并致电FileStream.SetLength()

【讨论】:

  • 效率低下是的 - 但有什么方法可以截断文件的开头?
  • 是的,您只是按照我的回答省略了写它。
  • @ssg:如果你省略了写入部分,那么文件如何更新?我想我错过了什么......
  • @Chris 你不能“截断”文件的开头,你必须读取整个文件,然后只写回你想要的文件部分(在这种情况下,除了第一行)。
【解决方案2】:

这是另一种选择:

        using (var stream = File.OpenRead("C:\\yourfile"))
        {
            var items = new LinkedList<string>();
            using (var reader = new StreamReader(stream))
            {
                reader.ReadLine(); // skip one line
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    //it's far better to do the actual processing here
                    items.AddLast(line);
                }
            }
        }

更新

如果您需要 IEnumerable&lt;string&gt; 并且不想浪费内存,您可以这样做:

    public static IEnumerable<string> GetFileLines(string filename)
    {
        using (var stream = File.OpenRead(filename))
        {
            using (var reader = new StreamReader(stream))
            {
                reader.ReadLine(); // skip one line
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    yield return line;
                }
            }
        }
    }


    static void Main(string[] args)
    {
        foreach (var line in GetFileLines("C:\\yourfile.txt"))
        {
            // do something with the line here.
        }
    }

【讨论】:

  • 没有行会怎样?
  • 聪明。很有道理。
  • 使用 LinkedList 与仅使用普通 List 相比有什么优势?
  • 链表不会在内部分配或重新分配数组。
【解决方案3】:
var lines = System.IO.File.ReadAllLines("test.txt");
System.IO.File.WriteAllLines("test.txt", lines.Skip(1).ToArray());

Skip 从序列的开头 中消除给定数量的元素。 Take 从序列的 end 中删除除了给定数量的元素之外的所有元素。

【讨论】:

    【解决方案4】:

    从文本文件中删除第一行

    System.IO.StreamReader file = new System.IO.StreamReader(filePath);
    string data = file.ReadToEnd();
    file.Close();
    data = Regex.Replace(data, "<.*\n", "");
    System.IO.StreamWriter file = new System.IO.StreamWriter(filePath, false);
    file.Write(data);
    file.Close();
    

    【讨论】:

    • 正则表达式在这种情况下真的是大材小用
    【解决方案5】:

    一行也可以

    File.WriteAllLines(origialFilePath,File.ReadAllLines(originalFilePath).Skip(1));
    

    假设您将 filePath 作为参数传递给函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2012-06-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      相关资源
      最近更新 更多