2015-07-27 10 views
6

Ich schreibe dieses Programm, um das Zeichen an der n-ten Stelle einer Zeichenfolge in einer Textdatei zu ersetzen. Meine Textdatei besteht aus dem folgenden Inhalt -Ersetzen Sie ein Zeichen der n-ten Position

the quick brown fox jumped over the lazy dog 
the quick brown fox jumped over the lazy dog 
the quick brown fox jumped over the lazy dog 
the quick brown fox jumped over the lazy dog 

Und hier ist der Ausgang des Code -

thehuick brown fox jumped over the lazy dog 

Das obige Ergebnis ist nicht das, was ich wollte. Nur eine Zeile wird aktualisiert, der Rest wird nicht mehr in der Datei gefunden.

Hier ist meine komplette Code in C#

 var txtFiles = Directory.GetFiles(@"E:\PROJ\replaceY\replaceY\", "*.txt"); 
     foreach (string currentFile in txtFiles) 
     { 
      string[] lines = File.ReadAllLines(currentFile); 
      foreach (string line in lines) 
      { 

       var theString = line; 
       var aStringBuilder = new StringBuilder(theString); 
       aStringBuilder.Remove(3, 2); 
       aStringBuilder.Insert(3, "h"); 
       theString = aStringBuilder.ToString(); 
       using (StreamWriter outfile = new StreamWriter(currentFile)) 
       { 
        outfile.Write(theString.ToString()); 
       } 

       Console.WriteLine(theString); 
       Console.ReadKey(); 

      } 
     } 

Wo ich falsch gelaufen? Bitte helfen Sie!

+2

Das ist wahrscheinlich die letzte Zeile, da Sie die Datei in jeder Schleifeniteration überschrieben haben. Probieren Sie 'new StreamWriter (currentFile, true)' – Cole9350

+0

es fügt nur die neue Zeichenfolge in der letzten Zeile an – shaiToro

+0

Ja, Ihre Schreibweise gibt es einen zusätzlichen Schritt, den ich vergessen habe, weil Sie aus der gleichen Datei lesen, überprüfen Sie meine Antwort – Cole9350

Antwort

6

Weil Ihre Logik sagt:

  • für jede Datei
    • die Datei öffnen
    • für jede Zeile in der Datei
      • verarbeiten
      • wieder öffnen Sie die Datei für schreiben
      • schreiben Sie die Zeile

Das heißt, Sie wiederholt die Datei mit der neuesten Zeile überschrieben. Am Ende jeder Datei enthält jede Datei nur eine Zeile: die letzte.

Sie werden fehlen, so etwas zu tun: benötigen

static void Main(string[] args) 
{ 
    foreach (string fileName in args) 
    { 
    string tempFileName = Path.GetTempFileName() ; 

    using (Stream  tmpFile = File.Open(tempFileName , FileMode.OpenOrCreate , FileAccess.Write , FileShare.None)) 
    using (StreamWriter output = new StreamWriter(tgtFile , Encoding.Default)) 
    using (Stream  srcFile = File.Open(fileName , FileMode.Open , FileAccess.ReadWrite , FileShare.None)) 
    using (StreamReader input = new StreamReader(srcFile , Encoding.Default , true)) 
    { 
     string line ; 
     while (null != (line=input.ReadLine())) 
     { 
     output.Write(line.Substring(0,3)) ; 
     output.Write('h') ; 
     output.WriteLine(line.Substring(5)) ; 
     } 
    } 

    string backupFileName = string.Format("{0}.{1:yyyy-MM-dd.HHmmss}.bak" , fileName , DateTime.Now) ; 

    File.Move(fileName  , backupFileName) ; 
    File.Move(tempFileName , fileName) ; 
    File.Delete(backupFileName) ; 

    } 
    return; 
} 

Sie werden einige try/catch/finally Ausnahme hinzufügen Umgang mit Fällen zu tun, wo etwas südlich mit einer Datei geht, so können Sie diese Datei rollen zurück zu seinem ursprünglichen Zustand.

Die anderen Optionen sind zu

  • die Datei zum Lesen öffnen.
  • schlürfen in den gesamten Inhalt mit File.ReadAllLines() oder dem Äquivalent
  • die Linien verwandeln, wie Sie die Originaldatei fit
  • wieder öffnen Sie die Originaldatei für
  • Schreib sehen
  • ausspucken die transformierten Inhalt in.

, die Sie so etwas wie dies bringt:

static void Main(string[] args) 
{ 
    foreach (string fileName in args) 
    { 
    string[] lines = File.ReadAllLines(fileName) ; 

    for (int i = 0 ; i < lines.Length ; ++i) 
    { 
     lines[i] = ApplyTransformHere(lines[i]) ; 
    } 

    File.WriteAllLines(fileName , lines) ; 

    } 

    return; 
} 
+0

Wo bin ich in meinem Code falsch gelaufen? – shaiToro

1

Auf einer Seite zur Kenntnis, aber immer noch zusammen. Möchten Sie Regex verwenden, um alle Zeilen zu ersetzen?

https://regex101.com/r/aC6cY1/1

Wie /(?<=^.{4,4})./gm

string input = "";//your sample text above 
string pattern = "(?<=^.{4,4})."; 
string replacement = "h"; 
Regex rgx = new Regex(pattern, RegexOptions.Multiline); 
string result = rgx.Replace(input, replacement); 

Ihre Frage in Bezug auf Ich würde:

var txtFiles = Directory.GetFiles(@"E:\PROJ\replaceY\replaceY\", "*.txt"); 
     foreach (string currentFile in txtFiles) 
     { 
     using (StreamReader sr = new StreamReader(currentFile)) 
      { 
       string input = sr.ReadToEnd(); 
       string pattern = "(?<=^.{4,4})."; 
       string replacement = "h"; 
       Regex rgx = new Regex(pattern, RegexOptions.Multiline); 
       string result = rgx.Replace(input, replacement); 
       using (StreamWriter outfile = new StreamWriter(currentFile, append)) 
        { 
         outfile.Write(result); 
        } 
      } 
} 
+0

Ich habe Probleme beim Schreiben in die Datei – shaiToro

0

Nehmen Sie die Zuschreibung aus dem zweiten foreach-Schleife, ersetzen Sie es ein Array von Strings sagen mit. Schreiben Sie dann das Array von Strings in Dateien unter der ersten foreach-Schleife. das sollte dein logisches Problem beheben.

+0

auch, sparen Sie viel Zeit beim Öffnen und Schließen von Dateien ... – whoops1122

3

habe ich eine boolean append am Anfang jeder neuen Datei, die auf false gesetzt ist, so erstellt er eine neue Datei für die erste Zeile, dann Sätze anfügen = true, so dass jeder nachfolgende Zeile auf

beigefügten
var txtFiles = Directory.GetFiles(@"E:\PROJ\replaceY\replaceY\", "*.txt"); 
foreach (string currentFile in txtFiles) 
{ 
    var append = false; 
    string[] lines = File.ReadAllLines(currentFile); 
    foreach (string line in lines) 
    { 
     var theString = line; 
     var aStringBuilder = new StringBuilder(theString); 
     aStringBuilder.Remove(3, 2); 
     aStringBuilder.Insert(3, "h"); 
     theString = aStringBuilder.ToString(); 
     using (StreamWriter outfile = new StreamWriter(currentFile, append)) 
     { 
      outfile.Write(theString.ToString() + Environment.NewLine); 
     } 
     append = true; 
    } 
} 
Verwandte Themen