C # के साथ एक फाइल में टेक्स्ट कैसे खोजें और बदलें


157

मेरा कोड अब तक

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

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


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

जवाबों:


321

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

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

5
अधिक जटिल प्रतिस्थापनों के लिए आप @CinCoder BTW का उपयोग कर सकते हैंRegex.Replace
सर्गेई बेरेज़ोवस्की

35
यह पूरी फ़ाइल को एक बार में मेमोरी में पढ़ता है, हमेशा अच्छा नहीं होता है।
बंशी

6
@ बंशी तूचे 'मैंने सिर्फ 9,000,000 पंक्तियों को पढ़ने की कोशिश की और इसे System out of memoryअपवाद के रूप में लिया गया।
Squ1rr3lz

4
बड़ी फ़ाइलों के लिए यह अधिक जटिल समस्या है। बाइट चंक पढ़ें, उनका विश्लेषण करें, एक और हिस्सा पढ़ें, आदि
अलेक्जेंडर

6
@ अलेक्सेंडर राइट। एक हिस्सा "... सोम" के साथ समाप्त होता है, और अगला "ई पाठ ..." से शुरू होता है। इसे और अधिक जटिल समस्या बनाता है।
djv

36

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

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
यह बहुत बड़ी फ़ाइल के लिए सरल लेकिन वांछनीय नहीं है। (पीएस मैं वह नहीं हूं, जिसने नीचा दिखाया)
एल्विन वोंग

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

@ Flynn1179 इस उदाहरण में सच नहीं है। यह काम करता हैं। कोशिश करके देखो। मुझे लगता है कि ReadAllTextइससे पहले फ़ाइल पहुंच बंद कर देता है WriteAllText। मैं अपने स्वयं के ऐप में इस तकनीक का उपयोग करता हूं।
स्टीविन्क

मुझे पता है; यह उदाहरण लिखते समय नहीं लिखा है, यह मेरी बात थी!
फ्लाईन 1179

27

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

कुछ इस तरह:

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
VB को 2 लाइनें बदलनी थीं: इनपुट का उपयोग न्यू स्ट्रीमरेडर (फ़ाइल नाम) के रूप में करते हुए इनपुट। पीक ()> = 0
ब्रेंट

8

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

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

आशा है कि ये आपकी मदद करेगा।


6

यह मैंने एक बड़ी (50 GB) फ़ाइल के साथ कैसे किया:

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

पहली विधि कुछ रेगेक्स रिप्लेसमेंट के लिए अच्छी तरह से काम करती है, लेकिन रेगेक्स.रेल या स्ट्रिंग.रियम मेमोरी त्रुटि से बाहर निकल सकता है यदि आप एक बड़ी फ़ाइल में कई जगह करते हैं।

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

static void ProcessLargeFile()
{
        if (File.Exists(outFileName)) File.Delete(outFileName);

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

        // EX 1 This opens entire file in memory and uses Replace and Regex Replace --> might cause out of memory error

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

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

        File.WriteAllText(outFileName, text);




        // EX 2 This reads file line by line 

        if (File.Exists(outFileName)) File.Delete(outFileName);

        using (var sw = new StreamWriter(outFileName))      
        using (var fs = File.OpenRead(inFileName))
        using (var sr = new StreamReader(fs, Encoding.UTF8)) //use UTF8 encoding or whatever encoding your file uses
        {
            string line, newLine;

            while ((line = sr.ReadLine()) != null)
            {
              //note: call your own replace function or use String.Replace here 
              newLine = Util.ReplaceDoubleBrackets(line);

              sw.WriteLine(newLine);
            }
        }
    }

    public static string ReplaceDoubleBrackets(string str)
    {
        //note: this replaces the first occurrence of a word delimited by [[ ]]

        //replace [[ with your own delimiter
        if (str.IndexOf("[[") < 0)
            return str;

        StringBuilder sb = new StringBuilder();

        //this part gets the string to replace, put this in a loop if more than one occurrence  per line.
        int posStart = str.IndexOf("[[");
        int posEnd = str.IndexOf("]]");
        int length = posEnd - posStart;


        // ... code to replace with newstr


        sb.Append(newstr);

        return sb.ToString();
    }

0

इस कोड ने मेरे लिए काम किया

- //-------------------------------------------------------------------
                           // Create an instance of the Printer
                           IPrinter printer = new Printer();

                           //----------------------------------------------------------------------------
                           String path = @"" + file_browse_path.Text;
                         //  using (StreamReader sr = File.OpenText(path))

                           using (StreamReader sr = new System.IO.StreamReader(path))
                           {

                              string fileLocMove="";
                              string newpath = Path.GetDirectoryName(path);
                               fileLocMove = newpath + "\\" + "new.prn";



                                  string text = File.ReadAllText(path);
                                  text= text.Replace("<REF>", reference_code.Text);
                                  text=   text.Replace("<ORANGE>", orange_name.Text);
                                  text=   text.Replace("<SIZE>", size_name.Text);
                                  text=   text.Replace("<INVOICE>", invoiceName.Text);
                                  text=   text.Replace("<BINQTY>", binQty.Text);
                                  text = text.Replace("<DATED>", dateName.Text);

                                       File.WriteAllText(fileLocMove, text);



                               // Print the file
                               printer.PrintRawFile("Godex G500", fileLocMove, "n");
                              // File.WriteAllText("C:\\Users\\Gunjan\\Desktop\\new.prn", s);
                           }

0

मैं सरल फॉरवर्ड कोड का उपयोग कर सकता हूं, जितना कि नीचे दिया गया कोड मेरे साथ ठीक काम करता है

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

/// <summary>
/// Replaces text in a file.
/// </summary>
/// <param name="filePath">Path of the text file.</param>
/// <param name="searchText">Text to search for.</param>
/// <param name="replaceText">Text to replace the search text.</param>
static public void ReplaceInFile( string filePath, string searchText, string replaceText )
{
    StreamReader reader = new StreamReader( filePath );
    string content = reader.ReadToEnd();
    reader.Close();

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

    StreamWriter writer = new StreamWriter( filePath );
    writer.Write( content );
    writer.Close();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.