如何使用c#删除具有行号的行?

时间:2010-07-22 10:26:10

标签: c# string file-io

我的名为test.txt的文件包含

本文档分为大约5个逻辑部分,从特征和结构概述开始,然后是内置列和单元格类型的概述。接下来是使用数据的概述,然后是特定主要功能的概述。最后,“最佳实践”部分总结了本文档的主要部分。

现在我要删除文件的第二行。 如何使用c#?

提前致谢。 Naveenkumar

5 个答案:

答案 0 :(得分:5)

List<string> lines = File.ReadAllLines(@"filename.txt").ToList();
if(lines.Count>lineNum){
   lines.RemoveAt(lineNum);
}
File.WriteAllLines(@"filename.txt",lines.ToArray());

答案 1 :(得分:1)

您可以通过\n分割文本,然后使用LINQ选择要保留的行并重新加入它们来实现此目的。

var lineNum=5;
var lines=File
    .ReadAllText(@"src.txt")
    .Split('\n');
var outTxt=String
    .Join(
        "\n",
        lines
            .Take(lineNum)
            .Concat(lines.Skip(lineNum+1))
            .ToArray()
    );

答案 2 :(得分:1)

这是一种非常有效的方法。

FileInfo x = new FileInfo(@"path\to\original");
string xpath = x.FullName;

FileInfo y = new FileInfo(@"path\to\temporary\new\file");

using (var reader = x.OpenText())
using (var writer = y.AppendText())
{
    // write 1st line
    writer.WriteLine(reader.ReadLine());

    reader.ReadLine(); // skip 2nd line

    // write all remaining lines
    while (!reader.EndOfStream)
    {
        writer.WriteLine(reader.ReadLine());
    }
}

x.Delete();
y.MoveTo(xpath);

答案 3 :(得分:0)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace rem2ndline
{
    class Program
    {
        static void Main(string[] args)
        {
            string inPath = @"c:\rem2ndline.txt";
            string outPath = @"c:\rem2ndlineresult.txt";
            StringBuilder builder = new StringBuilder();

            using (FileStream fso = new FileStream(inPath, FileMode.Open))
            {
                using (StreamReader rdr = new StreamReader(fso))
                {
                    int lineCount = 0;
                    bool canRead = true;
                    while (canRead) 
                    {
                        var line = rdr.ReadLine();
                        lineCount++;
                        if (line == null)
                        {
                            canRead = false;
                        }
                        else
                        {
                            if (lineCount != 2)
                            {
                                builder.AppendLine(line);   
                            }
                        }
                    }
                }

            }

            using(FileStream fso2 = new FileStream(outPath, FileMode.OpenOrCreate))
            {
                using (StreamWriter strw = new StreamWriter(fso2)) 
                {
                    strw.Write(builder.ToString());
                }
            }
        }
    }
}

答案 4 :(得分:0)

这就是我要做的。优点是您不必一次将文件存储在内存中,因此对于不同大小的文件(只要每个文件中包含的行具有相似的长度),内存要求应该类似。缺点是你无法管道回到同一个文件 - 你必须在之后使用删除和移动。

对于你的简单例子,扩展方法可能有点过分,但这些是我一次又一次依赖的两种扩展方法,以及ReadFile方法,所以我通常只需要在Main中编写代码( )。

class Program
{
  static void Main()
  {
    var file = @"C:\myFile.txt";
    var tempFile = Path.ChangeExtension(file, "tmp");

    using (var writer = new StreamWriter(tempFile))
    {
      ReadFile(file)
      .FilterI((i, line) => i != 1)
      .ForEach(l => writer.WriteLine(l));    
    }

    File.Delete(file);
    File.Move(tempFile, file);
  }

  static IEnumerable<String> ReadFile(String file)
  {
    using (var reader = new StreamReader(file))
    {
      while (!reader.EndOfStream)
      {
        yield return reader.ReadLine();
      }
    }
  }
}

static class IEnumerableExtensions
{
  public static IEnumerable<T> FilterI<T>(
      this IEnumerable<T> seq, 
      Func<Int32, T, Boolean> filter)
  {
    var index = 0;

    foreach (var item in seq)
    {
      if (filter(index, item))
      {
        yield return item;
      }

      index++;
    }
  }

  public static void ForEach<T>(
      this IEnumerable<T> seq,
      Action<T> action)
  {
    foreach (var item in seq)
    {
      action(item);
    }
  }
}