web-dev-qa-db-fra.com

Comment trouver et remplacer du texte dans un fichier avec C #

Mon code jusqu'à présent

StreamReader reading = File.OpenText("test.txt");
string str;
while ((str = reading.ReadLine())!=null)
{
      if (str.Contains("some text"))
      {
          StreamWriter write = new StreamWriter("test.txt");
      }
}

Je sais comment trouver le texte, mais je ne sais pas comment remplacer le texte du fichier par le mien.

138
Win Coder

Lire tout le contenu du fichier. Faites un remplacement avec String.Replace. Ecrire le contenu dans le fichier.

string text = File.ReadAllText("test.txt");
text = text.Replace("some text", "new value");
File.WriteAllText("test.txt", text);
277
Sergey Berezovskiy

Vous aurez du mal à écrire dans le même fichier que celui que vous lisez. Un moyen rapide consiste simplement à faire ceci:

File.WriteAllText("test.txt", File.ReadAllText("test.txt").Replace("some text","some other text"));

Vous pouvez mieux comprendre cela avec

string str = File.ReadAllText("test.txt");
str = str.Replace("some text","some other text");
File.WriteAllText("test.txt", str);
33
Flynn1179

Vous devez écrire toutes les lignes que vous avez lues dans le fichier de sortie, même si vous ne les modifiez pas.

Quelque chose comme:

using (var input = File.OpenText("input.txt"))
using (var output = new StreamWriter("output.txt")) {
  string line;
  while (null != (line = input.ReadLine())) {
     // optionally modify line.
     output.WriteLine(line);
  }
}

Si vous souhaitez effectuer cette opération à la place, le moyen le plus simple consiste à utiliser un fichier de sortie temporaire et à la fin, remplacez le fichier d'entrée par la sortie.

File.Delete("input.txt");
File.Move("output.txt", "input.txt");

(Il est difficile d’essayer d’effectuer des opérations de mise à jour au milieu d’un fichier texte, car il est toujours difficile de toujours remplacer la même longueur, étant donné que la plupart des encodages ont une largeur variable.)

EDIT: Plutôt que deux opérations de fichier pour remplacer le fichier d'origine, il est préférable d'utiliser File.Replace("input.txt", "output.txt", null). (Voir MSDN .)

26
Richard

Il est probable que vous deviez extraire le fichier texte en mémoire et ensuite effectuer les remplacements. Vous devrez ensuite écraser le fichier en utilisant la méthode que vous connaissez clairement. Donc, vous voudriez d'abord:

// Read lines from source file.
string[] arr = File.ReadAllLines(file);

Vous pouvez alors parcourir et remplacer le texte du tableau.

var writer = new StreamWriter(GetFileName(baseFolder, prefix, num));
for (int i = 0; i < arr.Length; i++)
{
    string line = arr[i];
    line.Replace("match", "new value");
    writer.WriteLine(line);
}

cette méthode vous donne un certain contrôle sur les manipulations que vous pouvez faire. Ou, vous pouvez simplement faire le remplacement en une seule ligne

File.WriteAllText("test.txt", text.Replace("match", "new value"));

J'espère que ça aide.

8
MoonKnight

Voici comment je l'ai fait avec un fichier volumineux (50 Go):

J'ai essayé 2 manières différentes: la première, lire le fichier en mémoire et utiliser Regex Replace ou String Replace. Ensuite, j'ai ajouté la chaîne entière à un fichier temporaire.

La première méthode fonctionne bien pour quelques remplacements de Regex, mais Regex.Replace ou String.Replace peuvent provoquer une erreur de mémoire insuffisante si vous effectuez plusieurs remplacements dans un fichier volumineux.

La seconde consiste à lire ligne par ligne le fichier temporaire, à créer manuellement chaque ligne à l'aide de StringBuilder et à ajouter chaque ligne traitée au fichier de résultat. Cette méthode était assez rapide.

static void ProcessLargeFile()
{
        if (File.Exists(outFileName)) File.Delete(outFileName);

        string text = File.ReadAllText(inputFileName, Encoding.UTF8);

        // EX 1 This opens entire file in memory and uses Replace and Regex Replace --> might cause out of memory error

        text = text.Replace("</text>", "");

        text = Regex.Replace(text, @"\<ref.*?\</ref\>", "");

        File.WriteAllText(outFileName, text);




        // EX 2 This reads file line by line 

        if (File.Exists(outFileName)) File.Delete(outFileName);

        using (var sw = new StreamWriter(outFileName))      
        using (var fs = File.OpenRead(inFileName))
        using (var sr = new StreamReader(fs, Encoding.UTF8)) //use UTF8 encoding or whatever encoding your file uses
        {
            string line, newLine;

            while ((line = sr.ReadLine()) != null)
            {
              //note: call your own replace function or use String.Replace here 
              newLine = Util.ReplaceDoubleBrackets(line);

              sw.WriteLine(newLine);
            }
        }
    }

    public static string ReplaceDoubleBrackets(string str)
    {
        //note: this replaces the first occurrence of a Word delimited by [[ ]]

        //replace [[ with your own delimiter
        if (str.IndexOf("[[") < 0)
            return str;

        StringBuilder sb = new StringBuilder();

        //this part gets the string to replace, put this in a loop if more than one occurrence  per line.
        int posStart = str.IndexOf("[[");
        int posEnd = str.IndexOf("]]");
        int length = posEnd - posStart;


        // ... code to replace with newstr


        sb.Append(newstr);

        return sb.ToString();
    }
3
live-love

Ce code a fonctionné pour moi

- //-------------------------------------------------------------------
                           // Create an instance of the Printer
                           IPrinter printer = new Printer();

                           //----------------------------------------------------------------------------
                           String path = @"" + file_browse_path.Text;
                         //  using (StreamReader sr = File.OpenText(path))

                           using (StreamReader sr = new System.IO.StreamReader(path))
                           {

                              string fileLocMove="";
                              string newpath = Path.GetDirectoryName(path);
                               fileLocMove = newpath + "\\" + "new.prn";



                                  string text = File.ReadAllText(path);
                                  text= text.Replace("<REF>", reference_code.Text);
                                  text=   text.Replace("<ORANGE>", orange_name.Text);
                                  text=   text.Replace("<SIZE>", size_name.Text);
                                  text=   text.Replace("<INVOICE>", invoiceName.Text);
                                  text=   text.Replace("<BINQTY>", binQty.Text);
                                  text = text.Replace("<DATED>", dateName.Text);

                                       File.WriteAllText(fileLocMove, text);



                               // Print the file
                               printer.PrintRawFile("Godex G500", fileLocMove, "n");
                              // File.WriteAllText("C:\\Users\\Gunjan\\Desktop\\new.prn", s);
                           }
0
radhason power