2012-11-22 9 views
100

मेरे कोड एक फ़ाइल में पाठ बदलें अब तककैसे खोजें करने के लिए और साथ सी #

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

मैं कैसे पाठ खोजने के लिए पता है, लेकिन मैं कैसे अपने खुद के साथ फ़ाइल में पाठ बदलने के लिए पर पता नहीं है ।

+0

केवल एक टिप के रूप में इस टिप्पणी पर विचार करें: आप दृश्य स्टूडियो है, तो आप समाधान में फ़ोल्डर शामिल हैं और खोज का उपयोग करें और भाग्य – StackOrder

उत्तर

204

पढ़ें सभी फ़ाइल सामग्री के साथ बेहतर बाहर है कि तैयार होती है। String.Replace के साथ प्रतिस्थापन करें। सामग्री को वापस फाइल लिखें।

string text = File.ReadAllText("test.txt"); 
text = text.Replace("some text", "new value"); 
File.WriteAllText("test.txt", text); 
+3

@WinCoder * BTW * अधिक जटिल प्रतिस्थापन के लिए आप 'Regex.Replace' –

+20

का उपयोग कर सकते हैं, यह पूरी फ़ाइल को स्मृति में एक बार में पढ़ता है, हमेशा अच्छा नहीं। – Banshee

+4

@ बंशी टॉच 'मैंने अभी 9,000,000 पंक्तियों को पढ़ने की कोशिश की और' सिस्टम मेमोरी 'अपवाद को फेंक दिया गया। –

26

आपको उसी फ़ाइल में लिखने में कठिनाई होगी जिसके बारे में आप पढ़ रहे हैं। एक त्वरित तरीका है बस यह करने के लिए है:

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

आप

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

के दृश्य स्टूडियो सर्वश्रेष्ठ की सुविधा की जगह इस सरल लेकिन के लिए वांछनीय नहीं है सकते हैं बहुत बड़ी फाइल। (पी। मैं वह नहीं हूं जो डाउनवॉटेड है) –

+1

मैं सहमत हूं, लेकिन आप इसे पढ़ने के दौरान फ़ाइल में नहीं लिख सकते हैं। जब तक आप एक अलग फ़ाइल में लिखते हैं, तो इसे बाद में नाम के साथ प्रतिस्थापित करें .. किसी भी तरह से, जब आप इसे बना रहे हों, तो नई फ़ाइल को कहीं और संग्रहीत किया जाना चाहिए, भले ही यह स्मृति या डिस्क पर हो। – Flynn1179

7

यह संभावना है कि आपको टेक्स्ट फ़ाइल को स्मृति में खींचना होगा और फिर प्रतिस्थापन करना होगा। आपको उस विधि का उपयोग करके फ़ाइल को ओवरराइट करना होगा जिसके बारे में आप स्पष्ट रूप से जानते हैं। तो आप पहले:

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

यो फिर सरणी में पाठ को लूप और प्रतिस्थापित कर सकता है।

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); 
} 

यह विधि आपको उन कुशलताओं पर कुछ नियंत्रण देती है जो आप कर सकते हैं। या, आप केवल एक पंक्ति

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

में प्रतिस्थापन कर सकते हैं, मुझे उम्मीद है कि इससे मदद मिलती है।

19

आपको आउटपुट फ़ाइल में पढ़ने वाली सभी पंक्तियां लिखने की आवश्यकता है, भले ही आप उन्हें नहीं बदलते हैं।

कुछ की तरह:

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); 
    } 
} 

आप जगह में यह कार्रवाई करना चाहते हैं तो सबसे आसान तरीका है एक अस्थायी आउटपुट फ़ाइल का उपयोग करने और अंत में उत्पादन के साथ इनपुट फ़ाइल की जगह है।

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

(है सही हमेशा प्रतिस्थापन होने क्योंकि एक ही लंबाई कठिन दिया सबसे एनकोडिंग परिवर्तनीय चौड़ाई हैं पाने के लिए पाठ फ़ाइल के बीच में अद्यतन कार्रवाई करने की कोशिश कर रहा है बल्कि कठिन।)

संपादित करें: मूल फ़ाइल को प्रतिस्थापित करने के लिए दो फ़ाइल संचालन के बजाय, File.Replace("input.txt", "output.txt", null) का उपयोग करने के लिए बेहतर। (MSDN देखें।)

+1

वीबी को 2 लाइनें बदलनी पड़ीं: इनपुट का उपयोग करके नई स्ट्रीम रीडर (फ़ाइल नाम) इनपुट के दौरान। Peek()> = 0 – Brent

0

मैंने इसे 2 अलग-अलग तरीकों से उपयोग करके पूरा किया, पहला: फ़ाइल को स्मृति में पढ़ना और रीगेक्स प्रतिस्थापन या स्ट्रिंग प्रतिस्थापन का उपयोग करना। फिर मैं पूरी स्ट्रिंग को एक अस्थायी फ़ाइल में जोड़ता हूं।

दूसरा टैब द्वारा फ़ाइल फ़ाइल लाइन को पढ़कर और मैन्युअल रूप से स्ट्रिंगबिल्डर का उपयोग करके प्रत्येक पंक्ति का निर्माण करके और परिणाम फ़ाइल में प्रत्येक संसाधित लाइन को जोड़कर है।

पहली विधि सामान्य रेगेक्स प्रतिस्थापन के लिए अच्छी तरह से काम करती है, लेकिन यदि आप Regex.Match को एक बड़ी फ़ाइल में करने का प्रयास करते हैं तो यह स्मृति को हॉग करता है।

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); 

       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(); 
    } 
संबंधित मुद्दे