在C#中删除文本文件的第一行

时间:2011-08-10 09:26:12

标签: c# .net windows

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

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

虽然,如何删除文本文件的开头呢?

5 个答案:

答案 0 :(得分:10)

而不是lines.Take,您可以改为使用lines.Skip,例如:

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

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

关于有效方式:低效率来自于将整个文件读入内存的必要性。反过来可以很容易地在流中搜索并将流复制到另一个输出文件,删除原始文件,并重命名旧文件。那个会同样快,但消耗更少的内存。

最后截断文件要容易得多。你可以找到trunaction的位置并拨打FileStream.SetLength()

答案 1 :(得分:5)

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

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

答案 2 :(得分:5)

这是另一种选择:

        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<string>并且不想浪费记忆,你可以这样做:

    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.
        }
    }

答案 3 :(得分:1)

从文本文件中删除第一行

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();

答案 4 :(得分:0)

也可以一行完成

SELECT Distinct 
       DB.[DEPARTMENT_ID], 
       DB.[CUSTOMER_ID], 
       DB.[CUSTOMER_AGE]
FROM  [PROD\SQL01].[PRD_Live].[dbo].[Customers] DB 
where DB.[DEPARTMENT_ID] IN (2001, 2002, 2040)
and   DB.[CUSTOMER_ID] NOT IN
      (
           SELECT Distinct [CUSTOMER_ID] 
           FROM  [NEWPRD_Live].[dbo].[Customers] n
           where n.[DEPARTMENT_ID] = DB.[DEPARTMENT_ID]
      )
ORDER BY DB.[DEPARTMENT_ID], DB.[CUSTOMER_ID]

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