সি # দিয়ে একটি ফাইলের পাঠ্য কীভাবে সন্ধান এবং প্রতিস্থাপন করবেন


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

আমি টেক্সটটি কীভাবে সন্ধান করব জানি, তবে কীভাবে ফাইলটিতে লেখাটি আমার নিজের সাথে প্রতিস্থাপন করা যায় সে সম্পর্কে আমার কোনও ধারণা নেই।


এই মন্তব্যটিকে কেবল একটি টিপ হিসাবে বিবেচনা করুন: আপনার যদি ভিজ্যুয়াল স্টুডিও থাকে তবে আপনি সমাধানগুলিতে ফোল্ডারগুলি অন্তর্ভুক্ত করতে পারেন এবং ভিজ্যুয়াল স্টুডিওর বৈশিষ্ট্যটি সন্ধান এবং প্রতিস্থাপন করতে পারেন luck সৌভাগ্যের সেরা
স্ট্যাকআর্ডার

উত্তর:


321

সমস্ত ফাইল সামগ্রী পড়ুন। সঙ্গে একটি প্রতিস্থাপন করুন String.Replace। ফাইলে ফিরে লিখিত সামগ্রী লিখুন।

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

5
@WinCoder BTW আরো জটিল প্রতিস্থাপন জন্য আপনি ব্যবহার করতে পারেনRegex.Replace
সের্গেই Berezovskiy

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

@ ফ্লাইএন 1179 এই উদাহরণে সত্য নয়। এটা কাজ করে। চেষ্টা কর. আমার ধারণা 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)। ( এমএসডিএন দেখুন ।)


1
ভিবি 2 লাইন পরিবর্তন করতে হয়েছিল: নিউ StreamReader (ফাইলের নাম) হিসাবে ইনপুট ব্যবহার করার সময় input.Peek ()> = 0
ব্রেন্ট

8

সম্ভবত আপনাকে পাঠ্য ফাইলটি মেমরিতে টানতে হবে এবং তারপরে প্রতিস্থাপনগুলি করতে হবে। এরপরে আপনার পরিষ্কারভাবে জানা পদ্ধতিটি ব্যবহার করে আপনাকে ফাইলটি ওভাররাইট করতে হবে। সুতরাং আপনি প্রথম:

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

YOu এরপরে লুপটি এড়াতে এবং অ্যারের পাঠ্যটি প্রতিস্থাপন করতে পারে।

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 জিবি) ফাইল দিয়ে আমি এটি এটি করেছি:

আমি 2 টি বিভিন্ন উপায়ে চেষ্টা করেছি: প্রথমটি, ফাইলটিকে মেমরিতে পড়তে এবং রেজেক্স রিপ্লেস বা স্ট্রিং রিপ্লেস ব্যবহার করে। তারপরে আমি পুরো স্ট্রিংটি একটি অস্থায়ী ফাইলে সংযুক্ত করেছি।

প্রথম পদ্ধতিটি কয়েকটি রিজেেক্স প্রতিস্থাপনের জন্য ভালভাবে কাজ করে, তবে রেগেক্স R রিপ্লেস বা স্ট্রিং ep রিপ্লেস মেমরির ত্রুটির কারণ হতে পারে যদি আপনি একটি বড় ফাইলে অনেকগুলি প্রতিস্থাপন করেন।

দ্বিতীয়টি হ'ল লাইন দ্বারা টেম্পল ফাইল লাইনটি পড়া এবং স্ট্রিংবিল্ডার ব্যবহার করে প্রতিটি লাইন ম্যানুয়ালি তৈরি করা এবং ফলাফলের ফাইলে প্রতিটি প্রক্রিয়াযুক্ত লাইন যুক্ত করা। এই পদ্ধতিটি বেশ দ্রুত ছিল।

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();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.