স্ট্রিংয়ে সি # ব্যবহার করে কীভাবে একটি সম্পূর্ণ ফাইল পড়বেন?


214

স্ট্রিং ভেরিয়েবলে কোনও পাঠ্য ফাইলটি পড়ার দ্রুততম উপায় কী?

আমি বুঝতে পারি এটি বেশ কয়েকটি উপায়ে করা যায় যেমন পৃথক বাইটগুলি পড়ুন এবং তারপরে সেগুলিকে স্ট্রিংয়ে রূপান্তর করুন। আমি নূন্যতম কোডিং সহ একটি পদ্ধতি খুঁজছিলাম।


উত্তর:


373

কীভাবে File.ReadAllText:

string contents = File.ReadAllText(@"C:\temp\test.txt");

3
যদিও ব্যবহারের জন্য সেরা ফাংশন নয়। হিসাবে দেবেন্দ্র ডি চৌহান তার উত্তরে পয়েন্ট আউট, StreamReader.ReadToEndআরও দক্ষ নয়।
ওভেন ব্ল্যাকার

40
@ ওভেন ব্ল্যাকার এটি "দ্রুততম" অর্থ "মৃত্যুদন্ড কার্যকর করার কমপক্ষে সময়" বা "বোঝার সর্বনিম্ন সময়" কিনা তার উপর নির্ভর করে।
Bonh

2
ফাইল.আরএডএলটেক্সট নিশ্চিতভাবেই ব্যবহার করা সবচেয়ে সহজ, তবে "দেবেন্দ্র ডি.চভান" উল্লেখ করেছেন, এটি সবচেয়ে দ্রুত নয়। সুতরাং আপনি যদি ছোট ফাইলগুলি পড়তে থাকেন তবে ফাইল ব্যবহার করার চেয়ে এটি আরও ভাল পছন্দ হবে eআরআডএলটেক্সট.ইটি আপনি পড়ছেন যে টেক্সট ফাইলগুলি কতটা বড় তা নির্ভর করে depends
মানা

করার সার্ভার থেকে পড়া পরীক্ষা এই , আশা কেউ সাহায্য করে।
শাইজুট

1
@ ওভেন ব্ল্যাকার - আপনি কি নিশ্চিত? মানদণ্ড দেখায় যে StreamReader.ReadToEndতুলনায় আরও দক্ষ ReadAllLines। যা প্রত্যাশিত, কারণ পরবর্তীগুলিও পাঠ্যগুলিকে লাইনে বিভক্ত করে। তবে আমরা একটি ভিন্ন পদ্ধতি সম্পর্কে কথা বলছি ReadAllText,। প্রকৃতপক্ষে আপনি যে উত্তরটি উল্লেখ করেছেন তা ReadAllTextকেবল StreamReader.ReadToEndঅভ্যন্তরীণভাবে কল করে।
এড আভিস

169

একটি বেঞ্চমার্ক তুলনা File.ReadAllLinesবনাম StreamReader ReadLineথেকে C # এর ফাইল হ্যান্ডলিং

ফাইল পড়ার তুলনা

ফলাফল। 10,000+ লাইনযুক্ত স্ট্রিমরিডার বড় ফাইলগুলির জন্য খুব দ্রুত, তবে ছোট ফাইলগুলির জন্য পার্থক্য নগণ্য। বরাবরের মতো, বিভিন্ন আকারের ফাইলগুলির জন্য পরিকল্পনা করুন এবং কেবলমাত্র পারফরম্যান্স সমালোচিত না হলে ফাইল.ReadAllLines ব্যবহার করুন।


স্ট্রিমরিডার পদ্ধতি

যেমন File.ReadAllTextঅন্যদের দ্বারা মতামতটির পরামর্শ দেওয়া হয়েছে, আপনি আরও দ্রুত চেষ্টা করতে পারেন (আমি পরিমাণগতভাবে পারফরম্যান্সের প্রভাবটি পরীক্ষা করেছি না, তবে এটি দ্রুত File.ReadAllText( নীচে তুলনা দেখুন) এর চেয়ে দ্রুত বলে মনে হচ্ছে )। পারফরম্যান্সের পার্থক্য কেবল বড় ফাইলগুলির ক্ষেত্রেই দৃশ্যমান হবে।

string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
     readContents = streamReader.ReadToEnd();
}


ফাইলের তুলনা (রেডএক্সএক্সএক্সএক্স)

পরিচায়ক কোড মাধ্যমে দেখার ILSpy আমি সম্পর্কে নিম্নলিখিত পাওয়া যায় File.ReadAllLines, File.ReadAllText

  • File.ReadAllText - StreamReader.ReadToEndঅভ্যন্তরীণভাবে ব্যবহার করে
  • File.ReadAllLines - এছাড়াও পঠন লাইন হিসাবে ফিরে আসার জন্য এবং ফাইলের শেষ পর্যন্ত লুপিংয়ের StreamReader.ReadLineঅতিরিক্ত ওভারহেড সহ অভ্যন্তরীণভাবে ব্যবহার করে List<string>


সুতরাং উভয় পদ্ধতি হ'ল উপরে নির্মিত সুবিধার অতিরিক্ত স্তরStreamReader । পদ্ধতির নির্দেশক শরীর দ্বারা এটি স্পষ্ট হয়।

File.ReadAllText() আইএলএসপিএস দ্বারা বিযুক্ত হিসাবে বাস্তবায়ন

public static string ReadAllText(string path)
{
    if (path == null)
    {
        throw new ArgumentNullException("path");
    }
    if (path.Length == 0)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
    }
    return File.InternalReadAllText(path, Encoding.UTF8);
}   

private static string InternalReadAllText(string path, Encoding encoding)
{
    string result;
    using (StreamReader streamReader = new StreamReader(path, encoding))
    {
        result = streamReader.ReadToEnd();
    }
    return result;
}

2
File.ReadAllTextআপনিও তুলনা করেছেন?
marc_s

2
ILSpy পরামর্শ দেয় যে File.ReadAllText()কেবল একটি মোড়কের ওপরে StreamReader.ReadToEnd()। আমি অনুমান করছি যে অতিরিক্ত স্তরটির চেয়ে কিছুটা ধীর গতিতে পারফরম্যান্স করা উচিত StreamReader.ReadToEnd()
দেবেন্দ্র ডি চাওয়ান

দুর্দান্ত উত্তর। যারা কেবল সমাধানটি খুঁজছেন তাদের জন্য সম্ভবত কিছুটা বেশি ব্যাখ্যা, তবে এটি নির্বাচিত উত্তর হিসাবে কমপক্ষে অনেক ভোটের দাবিদার।
স্যান্ডি গিফোর্ড 15

@ দেবেন্দ্র ডি.চোভান: অফটোপিক, তবে আমি কোথায় আইএলএসপিএসের জন্য রেফারেন্স বা ডকুমেন্টেশন পেতে পারি?
ভাইরাল জৈন

1
আপনি এখানে কোডটিও খুঁজে পেতে পারেন: রেফারেন্সসোর্স.মাইক্রোসফট . com /# mscorlib / system / io/… । আমি যা পাই না কেন, কেন ReadAllTextকেবল একটি মোড়কের জন্য গতিতে এই উল্লেখযোগ্য পার্থক্য রয়েছে streamReader.ReadToEnd();?
অলিভিয়ার জ্যাকট-ডেসকোম্বেস


6

ফাইলটি দেখুন Rআডলটেক্সট () পদ্ধতিটি

কিছু গুরুত্বপূর্ণ মন্তব্য:

এই পদ্ধতিটি একটি ফাইল খুলবে, ফাইলের প্রতিটি লাইন পড়ে এবং তারপরে প্রতিটি পংক্তিকে একটি স্ট্রিংয়ের উপাদান হিসাবে যুক্ত করে। এটি তখন ফাইলটি বন্ধ করে দেয়। একটি লাইন অক্ষরগুলির ক্রম হিসাবে সংজ্ঞায়িত হয় তারপরে ক্যারিজ রিটার্ন ('\ r'), একটি লাইন ফিড ('\ n'), বা ক্যারিজ ফেরত তত্ক্ষণাত্ একটি লাইন ফিড অনুসরণ করে। ফলস্বরূপ স্ট্রিংয়ে সমাপ্তি ক্যারেজ রিটার্ন এবং / অথবা লাইন ফিড থাকে না।

এই পদ্ধতিটি বাইট অর্ডার চিহ্নের উপস্থিতির ভিত্তিতে একটি ফাইলের এনকোডিংটি স্বয়ংক্রিয়ভাবে সনাক্ত করার চেষ্টা করে। ইউটিএফ -8 এবং ইউটিএফ -32 (উভয় বিগ-এন্ডিয়ান এবং লিটল-এন্ডিয়ান) এনকোডিং ফর্ম্যাটগুলি সনাক্ত করা যায়।

আমদানি করা পাঠ্য থাকতে পারে এমন ফাইলগুলি পড়ার সময় রিডএলটেক্সট (স্ট্রিং, এনকোডিং) পদ্ধতি ওভারলোড ব্যবহার করুন কারণ অজ্ঞাত অক্ষরগুলি সঠিকভাবে না পড়তে পারে।

ব্যতিক্রমগুলি উত্থাপিত হলেও, এই পদ্ধতিতে ফাইল হ্যান্ডেলটি বন্ধ হওয়ার গ্যারান্টিযুক্ত


6

string text = File.ReadAllText("Path");আপনার কাছে একটি স্ট্রিং ভেরিয়েবলের সমস্ত পাঠ্য রয়েছে। আপনার প্রতিটি লাইনের স্বতন্ত্র প্রয়োজন হলে আপনি এটি ব্যবহার করতে পারেন:

string[] lines = File.ReadAllLines("Path");


4

@ ক্রিস দুঃখিত। এটি উদ্ধৃতি MSDN Microsoft

প্রণালী বিজ্ঞান

এই পরীক্ষায় দুটি শ্রেণির তুলনা করা হবে। StreamReaderএবং FileStreamবর্গ আবেদন ডিরেক্টরি থেকে তাদের সম্পূর্ণতা 10K এবং 200K দুই ফাইলগুলি পড়তে নির্দেশ করা হবে না।

StreamReader (VB.NET)

sr = New StreamReader(strFileName)
Do
  line = sr.ReadLine()
Loop Until line Is Nothing
sr.Close()

FileStream (VB.NET)

Dim fs As FileStream
Dim temp As UTF8Encoding = New UTF8Encoding(True)
Dim b(1024) As Byte
fs = File.OpenRead(strFileName)
Do While fs.Read(b, 0, b.Length) > 0
    temp.GetString(b, 0, b.Length)
Loop
fs.Close()

ফলাফল

এখানে চিত্র বর্ণনা লিখুন

FileStreamএই পরীক্ষায় স্পষ্টতই দ্রুত। StreamReaderছোট ফাইলটি পড়তে অতিরিক্ত 50% বেশি সময় লাগে । বড় ফাইলের জন্য এটি অতিরিক্ত 27% সময় নিয়েছিল।

StreamReaderনা করে বিশেষত লাইন ব্রেকগুলির সন্ধান করছে FileStream। এটি অতিরিক্ত কিছু সময়ের জন্য অ্যাকাউন্ট করবে।

প্রস্তাবনা

ডেটা বিভাগের সাথে অ্যাপ্লিকেশনটির কী করা দরকার তার উপর নির্ভর করে অতিরিক্ত পার্সিং হতে পারে যার অতিরিক্ত প্রক্রিয়াকরণের সময় প্রয়োজন হবে। এমন একটি দৃশ্যের কথা বিবেচনা করুন যেখানে কোনও ফাইলে ডেটার কলাম থাকে এবং সারিগুলি CR/LFসীমিত করা হয়। StreamReaderনিচে খুঁজছেন লেখার লাইন কাজ করবে CR/LFও তারপরে অ্যাপ্লিকেশনটি অতিরিক্ত পার্সিং ডেটার একটি নির্দিষ্ট অবস্থান খুঁজছেন করতে হবে। (আপনি কী স্ট্রিং ভেবেছিলেন? সাবস্ট্রিং কোনও দাম ছাড়াই আসে?)

অন্যদিকে, FileStreamখণ্ডগুলিতে থাকা ডেটাগুলি পড়ে এবং একটি প্র্যাকটিভ বিকাশকারী তার সুবিধার জন্য এই স্ট্রিমটি ব্যবহার করতে আরও কিছু যুক্তি লিখতে পারে। যদি প্রয়োজনীয় ডেটা ফাইলের নির্দিষ্ট অবস্থানে থাকে তবে মেমরির ব্যবহার কম রাখায় এটি অবশ্যই যাওয়ার উপায়।

FileStream গতির জন্য উন্নত প্রক্রিয়া তবে আরও যুক্তি নেবে।


তবে কি StreamReader.ReadToEnd?
ওভেন ব্ল্যাকার

3

কমপক্ষে সম্ভাব্য সি # কোড সহ দ্রুততম অর্থ সম্ভবত এটি একটি:

string readText = System.IO.File.ReadAllText(path);

3

আপনি যদি অ্যাপ্লিকেশনটির বিন ফোল্ডার থেকে ফাইল বাছাই করতে চান তবে আপনি অনুসরণ করার চেষ্টা করতে পারেন এবং ব্যতিক্রম হ্যান্ডলিং করতে ভুলবেন না।

string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));

3

তুমি ব্যবহার করতে পার :

 public static void ReadFileToEnd()
{
    try
    {
    //provide to reader your complete text file
        using (StreamReader sr = new StreamReader("TestFile.txt"))
        {
            String line = sr.ReadToEnd();
            Console.WriteLine(line);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }
}


2

এই জিনিসগুলি মজাদার এবং আকর্ষণীয় মনে করে সেখানে যে সমস্ত নুবি রয়েছে তাদের জন্য, বেশিরভাগ ক্ষেত্রে একটি স্ট্রিংয়ে পুরো ফাইলটি পড়ার দ্রুততম উপায় ( এই মানদণ্ড অনুসারে ) নিম্নলিখিতটি নিম্নলিখিত:

using (StreamReader sr = File.OpenText(fileName))
{
        string s = sr.ReadToEnd();
}
//you then have to process the string

তবে সামগ্রিকভাবে কোনও পাঠ্য ফাইলটি পড়ার জন্য নিখুঁত দ্রুত নিম্নলিখিত হিসাবে উপস্থিত রয়েছে:

using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
               //do what you have to here
        }
}

বেশ কয়েকটি অন্যান্য কৌশলগুলির বিরুদ্ধে দাঁড় করান, এটি বেশিরভাগ সময় বাফারড্রেডারের বিপক্ষে জিতেছিল।


মন্তব্য দেরী আমি জানি, তবে আপনার বেঞ্চমার্কগুলিতে এবং লিঙ্কযুক্ত পৃষ্ঠায় কিছুটা বিভ্রান্ত। এটি কেবল পঠনের গতি পরীক্ষা করছে এবং পুরো স্ট্রিংয়ে লোড হচ্ছে না বলে মনে হচ্ছে। দ্বিতীয় কোড স্নিপেট একটি সময়ে একটি লাইন পড়ছে এবং কোনও সংযোজন করছে না তাই ডেটা ধরে রাখতে স্ট্রিং বিল্ডার বা স্ট্রিং থাকা দরকার "আপনার এখানে যা করতে হবে তা" করুন। যে সময়ে আরও ডেটা যুক্ত করতে ব্যবহৃত মেমরি পরীক্ষার ফলাফল পরিবর্তন করে would সুতরাং s সাধারণত একটি নির্দিষ্ট প্রস্থের ফাইল ধরে ধরে একই মাপের হয়ে থাকে তাই মেমরিটি একটি লাইনের আকারের জন্য সেট করা হবে এবং নতুন মেমোরিতে ডেটা অনুলিপি করার প্রয়োজন হবে না।
চার্লস বাইর্ন

2

আপনি এটি ব্যবহার করতে পারেন

public static string ReadFileAndFetchStringInSingleLine(string file)
    {
        StringBuilder sb;
        try
        {
            sb = new StringBuilder();
            using (FileStream fs = File.Open(file, FileMode.Open))
            {
                using (BufferedStream bs = new BufferedStream(fs))
                {
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        string str;
                        while ((str = sr.ReadLine()) != null)
                        {
                            sb.Append(str);
                        }
                    }
                }
            }
            return sb.ToString();
        }
        catch (Exception ex)
        {
            return "";
        }
    }

আশা করি এটা তোমাকে সাহায্য করবে।



0
public partial class Testfile : System.Web.UI.Page
{
    public delegate void DelegateWriteToDB(string Inputstring);
    protected void Page_Load(object sender, EventArgs e)
    {
        getcontent(@"C:\Working\Teradata\New folder");
    }

      private void SendDataToDB(string data)
    {
        //InsertIntoData
          //Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=kannan;Data Source=jaya;
        SqlConnection Conn = new SqlConnection("Data Source=aras;Initial Catalog=kannan;Integrated Security=true;");
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = Conn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "insert into test_file values('"+data+"')";
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();
    }

      private void getcontent(string path)
      {
          string[] files;
          files = Directory.GetFiles(path, "*.txt");
          StringBuilder sbData = new StringBuilder();
          StringBuilder sbErrorData = new StringBuilder();
          Testfile df = new Testfile();
          DelegateWriteToDB objDelegate = new DelegateWriteToDB(df.SendDataToDB);
          //dt.Columns.Add("Data",Type.GetType("System.String"));


          foreach (string file in files)
          {
              using (StreamReader sr = new StreamReader(file))
              {
                  String line;
                  int linelength;
                  string space = string.Empty;

                  // Read and display lines from the file until the end of 
                  // the file is reached.
                  while ((line = sr.ReadLine()) != null)
                  {
                      linelength = line.Length;
                      switch (linelength)
                      {
                          case 5:
                              space = "     ";
                              break;

                      }
                      if (linelength == 5)
                      {
                          IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line + space, null, null);
                      }
                      else if (linelength == 10)
                      {
                          IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line , null, null);
                      }

                  }
              }
          }
      }
    }

0

আমি একটি 2 এমবি সিএসভির জন্য একটি রিডএলটেক্সট এবং স্ট্রিমবফারের মধ্যে একটি তুলনা করেছি এবং দেখে মনে হচ্ছে যে পার্থক্যটি খুব কম তবে রিডআলটেক্সট সম্পূর্ণ ফাংশনগুলির জন্য নেওয়া সময় থেকে উপরের হাত ধরেছে বলে মনে হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.