2009-12-16 32 views
33

Varolan bir dosyayı açmanın ve bildirilen bir dizeyle eşleşen tüm dizeleri yeni bir dizeyle değiştirmenin en iyi yolunu bulmaya çalışıyorum, sonra kapatın ve kapatın.Bir dosya açın ve dizeleri değiştirin C#

Öneriler?

File.WriteAllText("Path", Regex.Replace(File.ReadAllText("Path"), "[Pattern]", "Replacement")); 
+0

: Eğer Görsel stüdyon var, çözümde klasörleri dahil ve görsel stüdyonun arama ve değiştirme özelliğini kullanabilirsiniz. Şansın en iyi – StackOrder

cevap

74

bir satırda yapılabilir aşağıdaki gibi ...

private static void ReplaceTextInFile(string originalFile, string outputFile, string searchTerm, string replaceTerm) 
{ 
    string tempLineValue; 
    using (FileStream inputStream = File.OpenRead(originalFile)) 
    { 
     using (StreamReader inputReader = new StreamReader(inputStream)) 
     { 
      using (StreamWriter outputWriter = File.AppendText(outputFile)) 
      { 
       while(null != (tempLineValue = inputReader.ReadLine())) 
       { 
        outputWriter.WriteLine(tempLineValue.Replace(searchTerm,replaceTerm)); 
       } 
      } 
     } 
    } 
} 

Sonra orijinal dosya kaldırmak ve orijinal isme yenisini adlandırmak gerekirdi, ama bu önemsiz - bazı ba ekleyerek olduğu gibi sic hata yöntemine denetleme.

Elbette, değiştirdiğiniz metin iki veya daha fazla çizgide olabilirse, biraz daha fazla çalışma yapmanız gerekir, ancak bunu anlamanız için size bırakacağım. :)

soru gereksinimlerini karşılayan
+5

Bu, tüm dosyayı belleğe yükleyecek – Banshee

+1

Yapılandırma dosyalarını değiştirmek için çok güzel bir oneliner :) – Gorgsenegger

9
using System; 
using System.IO; 
using System.Text.RegularExpressions; 

public static void ReplaceInFile(
         string filePath, string searchText, string replaceText) 
{ 

    var content = string.Empty; 
    using (StreamReader reader = new StreamReader(filePath)) 
    { 
     content = reader.ReadToEnd(); 
     reader.Close(); 
    } 

    content = Regex.Replace(content, searchText, replaceText); 

    using (StreamWriter writer = new StreamWriter(filePath)) 
    { 
     writer.Write(content); 
     writer.Close(); 
    } 
} 
+2

+1, en iyi uygulama afaik olan streamreader/yazar etrafında 'usings' eklemek isteyebilirsiniz. –

+0

StreamReader'ı File.WriteAllText ile File.ReadAllText ve StreamWriter ile değiştirebilirsiniz. Biraz daha az kod ... Ayrıca, ne değiştirdiğinize bağlı olarak, Regex.Escape searchText'e veya string.Replace 'ı kullanmanız gerekebilir. –

+1

Belleğe okumadan, dosya satırını satır olarak işleyebilirsiniz. Dosyayı değiştirmek isterseniz yeni bir dosyaya yazıp eski dosya adına kopyalayabilirsiniz. – CSharpAtl

25

Eğer yılında büyük dosyaları okuma konum ve değiştirme için size dize birden fazla satıra kırık görünmeyebilir, ben bir şey öneririm:

+0

iç içe geçmişleri onları istifleme lehine, ama bence bu gerçekten sadece bir tercih. Birden fazla iç içe yerleştirme beni biraz sıkıştırıyor;) –

+0

İkili dosyaları desteklemek için bu kodun nasıl değiştirilebileceğini bilmek istiyorum. – Tomas

+0

Büyük dosyalar nedir? https://web.archive.org/web/20140316075223/http://towardsnext.wordpress.com/2009/02/02/replace-data-in-file-c/ – Kiquenet

9

hafif Regex gerektirmez önerilen yanıta iyileştirme ve: Sadece bir ipucu olarak şu yorumu düşünün

File.WriteAllText("Path", File.ReadAllText("Path").Replace("SearchString", "Replacement")); 
0
public partial class ReadAndChange : System.Web.UI.Page 
{ 
    ArrayList FolderList = new ArrayList(); 
    ArrayList FolderListSearch = new ArrayList(); 
    ArrayList FileList = new ArrayList(); 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     AllFolderList("D:\\BinodBackup\\Nilesh\\14.5.2013\\Source"); 
     foreach (string Path in FolderList) 
     { 
      AllFileList(Path); 
     } 
     foreach (string Path in FileList) 
     { 
      ReplaceFile(Path, Path.Replace("Source", "EditedCode")); 
     } 

     //string SourcePath = "D:\\BinodBackup\\Nilesh\\14.5.2013\\Onesource\\Onesource\\UserManagement\\UserControls\\AddUserDetails.ascx.cs"; 
     //string ReplacePath = "D:\\AddUserDetails.ascx.cs"; 
     //ReplaceFile(SourcePath, ReplacePath); 
    } 

    private static void ReplaceFile(string SourcePath, string ReplacePath) 
    { 
     int counter = 1; 
     string line; 

     // Read the file and display it line by line. 
     System.IO.StreamReader file = new System.IO.StreamReader(SourcePath); 
     while ((line = file.ReadLine()) != null) 
     { 
      if (!(line.Contains("//"))) 
      { 
       if (line.Contains(".LogException(")) 
       { 
        //Console.WriteLine(counter.ToString() + ": " + line); 
        string[] arr = line.Split(','); 
        string stringToReplace = arr[0].Replace("LogException", "Publish") + " , " + arr[2].Trim() + " , " + arr[3].Replace(");", "").Trim() + " , " + arr[1].Trim() + ");"; 
        //File.WriteAllText(currentPath, Regex.Replace(File.ReadAllText(currentPath), line, line + " Added")); 
        File.WriteAllText(ReplacePath, File.ReadAllText(ReplacePath).Replace(line, stringToReplace)); 
        //ReplaceInFile(currentPath, line, stringToReplace); 
       } 
      } 

      counter++; 
     } 

     file.Close(); 
    } 
    private void AllFileList(string FolderPath) 
    { 
     DirectoryInfo dir = new DirectoryInfo(FolderPath); 
     DirectoryInfo[] subdir = dir.GetDirectories(); 
     if (subdir.Length > 0) 
     { 

      foreach (DirectoryInfo dr in subdir) 
      { 
       FileInfo[] files1 = dr.GetFiles(); 
       foreach (FileInfo file in files1) 
       { 
        if(file.Name.EndsWith(".cs")) 
        CheckAndAdd((file.DirectoryName + "\\" + file.Name), FileList); 
       } 

      } 
     } 
    } 

    private void AllFolderList(string FolderPath) 
    { 
     string CurFolderPatgh = FolderPath; 
     Again: 
     AddToArrayList(CurFolderPatgh); 
     DirectoryInfo dir = new DirectoryInfo(CurFolderPatgh); 
     DirectoryInfo[] subdir = dir.GetDirectories(); 

     if (subdir.Length > 0) 
     { 
      foreach (DirectoryInfo dr in subdir) 
      { 
       AddToArrayList(((System.IO.FileSystemInfo)(dir)).FullName + "\\" + dr.Name); 
      } 
     } 
     if (FolderListSearch.Count > 0) 
     { 
      foreach (string dr in FolderListSearch) 
      { 
       CurFolderPatgh = dr; 
       FolderListSearch.Remove(dr); 
       goto Again; 
      } 
     } 
    } 

    private void AddToArrayList(string FolderPath) 
    { 
     if (!(FolderList.Contains(FolderPath))) 
     { 
      CheckAndAdd(FolderPath, FolderList); 
      CheckAndAdd(FolderPath, FolderListSearch); 
     } 
    } 

    private void CheckAndAdd(string FolderPath,ArrayList ar) 
    { 
     if (!(ar.Contains(FolderPath))) 
     { 
      ar.Add(FolderPath); 
     } 
    } 

    public static void ReplaceInFile(
         string filePath, string searchText, string replaceText) 
    { 

     var content = string.Empty; 
     using (StreamReader reader = new StreamReader(filePath)) 
     { 
      content = reader.ReadToEnd(); 
      reader.Close(); 
     } 

     content = content.Replace(searchText, replaceText); 

     using (StreamWriter writer = new StreamWriter(filePath)) 
     { 
      writer.Write(content); 
      writer.Close(); 
     } 
    } 
} 
0
using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.IO; 
using System.Linq; 

namespace DevExpressFileEditing 
{ 
    class Program 
    { 
     static List<FileInfo> _files; 
     private static Dictionary<string, string> _replaceList; 

     static void Main() 
     { 
      _files = new List<FileInfo>(); 
      _replaceList = new Dictionary<string, string>(); 

      Console.WriteLine("Dark directory searching"); 
      SearchFilesInDirectories(new DirectoryInfo(@"C:\Sourcebank\Dark")); 

      Console.WriteLine("Light directory searching"); 
      SearchFilesInDirectories(new DirectoryInfo(@"C:\Sourcebank\Light")); 

      Console.WriteLine("{0} files found", _files.Count.ToString(CultureInfo.InvariantCulture)); 

      Console.WriteLine("Replace dictinary creating"); 
      CreateReplaceList(); 
      Console.WriteLine("{0} item added", _replaceList.Count.ToString(CultureInfo.InvariantCulture)); 

      Console.Write("Replacement doing"); 
      for (int i = 0; i < _files.Count; i++) 
      { 
       var fileInfo = _files[i]; 
       Console.CursorLeft = 0; 
       Console.Write("{0} of {1}", i.ToString(CultureInfo.InvariantCulture), _files.Count.ToString(CultureInfo.InvariantCulture)); 
       ReplaceInFile(fileInfo.FullName); 
      } 
      Console.CursorLeft = 0; 
      Console.Write("Replacement done"); 
     } 

     private static void SearchFilesInDirectories(DirectoryInfo dir) 
     { 
      if (!dir.Exists) return; 

      foreach (DirectoryInfo subDirInfo in dir.GetDirectories()) 
       SearchFilesInDirectories(subDirInfo); 

      foreach (var fileInfo in dir.GetFiles()) 
       _files.Add(fileInfo); 
     } 

     private static void CreateReplaceList() 
     { 
      _replaceList.Add("Color=\"#FFF78A09\"", "Color=\"{DynamicResource AccentColor}\""); 
      _replaceList.Add("Color=\"{StaticResource ColorHot}\"", "Color=\"{DynamicResource AccentColor}\""); 
      _replaceList.Add("Color=\"#FFCC0000\"", "Color=\"{DynamicResource AccentColor}\""); 
      _replaceList.Add("To=\"#FFCC0000\"", "To=\"{DynamicResource AccentColor}\""); 
      _replaceList.Add("To=\"#FFF78A09\"", "To=\"{DynamicResource AccentColor}\""); 
      _replaceList.Add("Background=\"#FFF78A09\"", "Background=\"{DynamicResource Accent}\""); 
      _replaceList.Add("Foreground=\"#FFF78A09\"", "Foreground=\"{DynamicResource Accent}\""); 
      _replaceList.Add("BorderBrush=\"#FFF78A09\"", "BorderBrush=\"{DynamicResource Accent}\""); 
      _replaceList.Add("Value=\"#FFF78A09\"", "Value=\"{DynamicResource Accent}\""); 
      _replaceList.Add("Fill=\"#FFF78A09\"", "Fill=\"{DynamicResource Accent}\""); 
     } 

     public static void ReplaceInFile(string filePath) 
     { 
      string content; 
      using (var reader = new StreamReader(filePath)) 
      { 
       content = reader.ReadToEnd(); 
       reader.Close(); 
      } 

      content = _replaceList.Aggregate(content, (current, item) => current.Replace(item.Key, item.Value)); 

      using (var writer = new StreamWriter(filePath)) 
      { 
       writer.Write(content); 
       writer.Close(); 
      } 
     } 
    } 
} 
+0

Aggregate() öğesini nasıl kullanacağınızı göstermek için hala iyi uygulamaları kullanırken metni değiştirin, +1. – shipr

İlgili konular