2010-07-22 7 views
0

Mon fichier nommé test.txt contientComment supprimer une ligne ayant un numéro de ligne en utilisant C#?

Ce document est divisé en 5 sections logiques commençant par une vue d'ensemble des fonctions et des structures, suivie d'un aperçu des types de colonnes et de cellules intégrés. Vous trouverez ensuite un aperçu de l'utilisation des données, suivi d'un aperçu des principales fonctionnalités spécifiques. Enfin, une section «meilleures pratiques» conclut la partie principale de ce document.

Maintenant, je veux supprimer la 2e ligne du fichier. Comment le faire en utilisant C#?

Merci d'avance. Naveenkumar

+2

Le troisième paragraphe est-il en rapport avec cette question? – spender

+0

ARRÊTEZ D'ESSAYER DE MUTER LES DONNÉES DU FICHIER !!!! – leppie

Répondre

1

Vous pouvez y parvenir en divisant le texte par \n, puis en utilisant LINQ pour sélectionner les lignes que vous souhaitez conserver et en les rejoignant.

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

'File.ReadAllLines()' pourrait être plus facile ... – cjk

+0

Cette méthode souffre de charger le fichier entier dans la mémoire, puis produit une copie proche dans la mémoire (moins la deuxième ligne). Il faut donc être prudent lorsque le fichier est volumineux et que vous avez des contraintes de mémoire. –

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

Ce code est court et également correct - ce qui est le principal. Cependant, notez qu'il chargera le contenu entier du fichier dans la mémoire à la fois. Son utilité dépend donc de la taille du fichier et de la quantité de mémoire à avoir. –

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

Voici ce que je ferais. L'avantage est que vous n'avez pas besoin d'avoir le fichier en mémoire en une seule fois, donc les besoins en mémoire doivent être similaires pour les fichiers de taille variable (tant que les lignes contenues dans chacun des fichiers sont de longueur similaire). L'inconvénient est que vous ne pouvez pas rediriger vers le même fichier - vous devez jouer avec un Delete et un Move après. Les méthodes d'extension peuvent être exagérées pour votre exemple simple, mais ce sont deux méthodes d'extension auxquelles je peux me fier encore et encore, ainsi que la méthode ReadFile, donc je dois seulement écrire le code dans 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); 
    } 
    } 
} 
1

Voici une façon très efficace de le faire.

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); 
+0

+1 - principes similaires à la mienne, sans la réutilisation-manie! –

Questions connexes