Как удалить строку с номером строки с помощью c #? - PullRequest
0 голосов
/ 22 июля 2010

Мой файл с именем test.txt содержит

Этот документ состоит из примерно 5 логических разделов, начиная с обзора функций и структур, а затем обзора встроенных столбцов и типов ячеек. Далее приводится обзор работы с данными, после чего следует обзор конкретных основных функций. Наконец, раздел «Лучшие практики» завершает основную часть этого документа.

Теперь я хочу удалить 2-ю строку файла. Как это сделать с помощью c #?

Спасибо заранее. Naveenkumar

Ответы [ 5 ]

5 голосов
/ 22 июля 2010
List<string> lines = File.ReadAllLines(@"filename.txt").ToList();
if(lines.Count>lineNum){
   lines.RemoveAt(lineNum);
}
File.WriteAllLines(@"filename.txt",lines.ToArray());
1 голос
/ 22 июля 2010

Вот довольно эффективный способ сделать это.

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);
1 голос
/ 22 июля 2010

Вы можете добиться этого, разделив текст на \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()
    );
0 голосов
/ 22 июля 2010

Вот что я бы сделал.Преимущество заключается в том, что вам не нужно одновременно хранить файл в памяти, поэтому требования к памяти должны быть одинаковыми для файлов разного размера (при условии, что строки, содержащиеся в каждом из файлов, имеют одинаковую длину).Недостаток в том, что вы не можете вернуться к одному и тому же файлу - вам придется возиться с Delete и Move после этого.

Методы расширения могут быть излишними для вашего простого примера, но это два расширенияметоды, на которые я полагаюсь снова и снова, а также метод 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);
    }
  }
}
0 голосов
/ 22 июля 2010
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());
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...