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 n'ai aucune idée de comment remplacer le texte dans le fichier avec mes propres.

121
demandé sur Cameron Fisher-Gomez FastAssas 2012-11-22 13:31:49

5 réponses

Lire tout le contenu du fichier. Faites un remplacement avec String.Replace. Écrire le contenu de fichier.

string text = File.ReadAllText("test.txt");
text = text.Replace("some text", "new value");
File.WriteAllText("test.txt", text);
235
répondu Sergey Berezovskiy 2012-11-22 09:38:00

Vous allez avoir du mal à écrire dans le même fichier que vous lisez. Un moyen rapide est de simplement faire ceci:

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

Vous pouvez mieux définir cela avec

string str = File.ReadAllText("test.txt");
str = str.Replace("some text","some other text");
File.WriteAllText("test.txt", str);
29
répondu Flynn1179 2012-11-22 09:37:42

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

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 dans le plus simple est d'utiliser un temporaire du fichier de sortie et à la fin de remplacer le fichier d'entrée à la sortie.

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

(essayer d'effectuer des opérations de mise à jour au milieu du fichier texte est plutôt difficile à obtenir car toujours avoir le remplacement de la même longueur est difficile compte tenu de la plupart des encodages sont de largeur variable.)

EDIT: plutôt que deux opérations de fichier pour remplacer le fichier d'origine, mieux vaut utiliser File.Replace("input.txt", "output.txt", null). (Voir MSDN .)

21
répondu Richard 2017-03-01 07:51:12

Il est probable que vous devrez tirer le fichier texte en mémoire et ensuite faire les remplacements. Vous devrez alors écraser le fichier en utilisant la méthode que vous connaissez clairement. Donc, vous devez d'abord:

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

Vous pouvez ensuite parcourir et remplacer le texte dans le 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 ligne

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

J'espère que cela aide.

7
répondu MoonKnight 2012-11-22 09:39:06

Voici comment je l'ai fait avec un fichier GB multiple: j'ai utilisé 2 façons différentes, la première: lire le fichier en mémoire et utiliser Regex Replace ou string Replace. Ensuite, j'ajoute la chaîne entière à un fichier temporaire.

La seconde consiste à lire le fichier temp ligne par ligne et à construire manuellement chaque ligne à L'aide de StringBuilder et à ajouter chaque ligne traitée au fichier de résultat.

La première méthode fonctionne bien pour les remplacements généraux de Regex, mais elle bloque la mémoire si vous essayez do do Regex.Correspond à un fichier volumineux.

        static void ProcessLargeFile()
        {

            if (File.Exists(outputDefsFileName)) File.Delete(outputDefsFileName);
            if (File.Exists(defTempProc1FileName)) File.Delete(defTempProc1FileName);
            if (File.Exists(defTempProc2FileName)) File.Delete(defTempProc2FileName);

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

            // PROC 1 This opens entire file in memory and uses Replace and Regex Replace

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

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

            File.WriteAllText(defTempProc1FileName, text);

            // PROC 2 This reads file line by line and uses String.IndexOf and String.Substring and StringBuilder to build the new lines 


            using (var fileStream = File.OpenRead(defTempProc1FileName))
            using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
            {
                string line, newdef;

                while ((line = streamReader.ReadLine()) != null)
                {

                    String[] arr = line.Split('\t');

                    string def = arr[2];

                    newdef = Util.ProcessDoubleBrackets(def);

//note: don't use File.AppendAllText, it opens the file every time. Instead open StreamWriter in the beginning and write to it.
                   // File.AppendAllText(defTempProc2FileName, newdef  + Environment.NewLine);
                }
            }
        }

        public static string ProcessDoubleBrackets(string def)
        {
            if (def.IndexOf("[[") < 0)
                return def;

            StringBuilder sb = new StringBuilder();
            ... Some processing

            sb.Append(def.Substring(pos, i - pos));

            ... Some processing
            return sb.ToString();
        }
1
répondu live-love 2018-07-10 18:00:27