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