স্ট্রিং ভেরিয়েবলে কোনও পাঠ্য ফাইলটি পড়ার দ্রুততম উপায় কী?
আমি বুঝতে পারি এটি বেশ কয়েকটি উপায়ে করা যায় যেমন পৃথক বাইটগুলি পড়ুন এবং তারপরে সেগুলিকে স্ট্রিংয়ে রূপান্তর করুন। আমি নূন্যতম কোডিং সহ একটি পদ্ধতি খুঁজছিলাম।
স্ট্রিং ভেরিয়েবলে কোনও পাঠ্য ফাইলটি পড়ার দ্রুততম উপায় কী?
আমি বুঝতে পারি এটি বেশ কয়েকটি উপায়ে করা যায় যেমন পৃথক বাইটগুলি পড়ুন এবং তারপরে সেগুলিকে স্ট্রিংয়ে রূপান্তর করুন। আমি নূন্যতম কোডিং সহ একটি পদ্ধতি খুঁজছিলাম।
উত্তর:
কীভাবে File.ReadAllText
:
string contents = File.ReadAllText(@"C:\temp\test.txt");
StreamReader.ReadToEnd
আরও দক্ষ নয়।
StreamReader.ReadToEnd
তুলনায় আরও দক্ষ ReadAllLines
। যা প্রত্যাশিত, কারণ পরবর্তীগুলিও পাঠ্যগুলিকে লাইনে বিভক্ত করে। তবে আমরা একটি ভিন্ন পদ্ধতি সম্পর্কে কথা বলছি ReadAllText
,। প্রকৃতপক্ষে আপনি যে উত্তরটি উল্লেখ করেছেন তা ReadAllText
কেবল StreamReader.ReadToEnd
অভ্যন্তরীণভাবে কল করে।
একটি বেঞ্চমার্ক তুলনা 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;
}
File.ReadAllText
আপনিও তুলনা করেছেন?
File.ReadAllText()
কেবল একটি মোড়কের ওপরে StreamReader.ReadToEnd()
। আমি অনুমান করছি যে অতিরিক্ত স্তরটির চেয়ে কিছুটা ধীর গতিতে পারফরম্যান্স করা উচিত StreamReader.ReadToEnd()
।
ReadAllText
কেবল একটি মোড়কের জন্য গতিতে এই উল্লেখযোগ্য পার্থক্য রয়েছে streamReader.ReadToEnd();
?
string contents = System.IO.File.ReadAllText(path)
ফাইলটি দেখুন Rআডলটেক্সট () পদ্ধতিটি
কিছু গুরুত্বপূর্ণ মন্তব্য:
এই পদ্ধতিটি একটি ফাইল খুলবে, ফাইলের প্রতিটি লাইন পড়ে এবং তারপরে প্রতিটি পংক্তিকে একটি স্ট্রিংয়ের উপাদান হিসাবে যুক্ত করে। এটি তখন ফাইলটি বন্ধ করে দেয়। একটি লাইন অক্ষরগুলির ক্রম হিসাবে সংজ্ঞায়িত হয় তারপরে ক্যারিজ রিটার্ন ('\ r'), একটি লাইন ফিড ('\ n'), বা ক্যারিজ ফেরত তত্ক্ষণাত্ একটি লাইন ফিড অনুসরণ করে। ফলস্বরূপ স্ট্রিংয়ে সমাপ্তি ক্যারেজ রিটার্ন এবং / অথবা লাইন ফিড থাকে না।
এই পদ্ধতিটি বাইট অর্ডার চিহ্নের উপস্থিতির ভিত্তিতে একটি ফাইলের এনকোডিংটি স্বয়ংক্রিয়ভাবে সনাক্ত করার চেষ্টা করে। ইউটিএফ -8 এবং ইউটিএফ -32 (উভয় বিগ-এন্ডিয়ান এবং লিটল-এন্ডিয়ান) এনকোডিং ফর্ম্যাটগুলি সনাক্ত করা যায়।
আমদানি করা পাঠ্য থাকতে পারে এমন ফাইলগুলি পড়ার সময় রিডএলটেক্সট (স্ট্রিং, এনকোডিং) পদ্ধতি ওভারলোড ব্যবহার করুন কারণ অজ্ঞাত অক্ষরগুলি সঠিকভাবে না পড়তে পারে।
ব্যতিক্রমগুলি উত্থাপিত হলেও, এই পদ্ধতিতে ফাইল হ্যান্ডেলটি বন্ধ হওয়ার গ্যারান্টিযুক্ত
System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
@ ক্রিস দুঃখিত। এটি উদ্ধৃতি 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
?
কমপক্ষে সম্ভাব্য সি # কোড সহ দ্রুততম অর্থ সম্ভবত এটি একটি:
string readText = System.IO.File.ReadAllText(path);
তুমি ব্যবহার করতে পার :
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);
}
}
এই জিনিসগুলি মজাদার এবং আকর্ষণীয় মনে করে সেখানে যে সমস্ত নুবি রয়েছে তাদের জন্য, বেশিরভাগ ক্ষেত্রে একটি স্ট্রিংয়ে পুরো ফাইলটি পড়ার দ্রুততম উপায় ( এই মানদণ্ড অনুসারে ) নিম্নলিখিতটি নিম্নলিখিত:
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
}
}
বেশ কয়েকটি অন্যান্য কৌশলগুলির বিরুদ্ধে দাঁড় করান, এটি বেশিরভাগ সময় বাফারড্রেডারের বিপক্ষে জিতেছিল।
আপনি এটি ব্যবহার করতে পারেন
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 "";
}
}
আশা করি এটা তোমাকে সাহায্য করবে।
আপনি কোনও পাঠ্য ফাইল থেকে স্ট্রিংয়ে স্ট্রিংয়ে পাঠ্য পড়তে পারেন
string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
str = str + sr.ReadLine();
}
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);
}
}
}
}
}
}
আমি একটি 2 এমবি সিএসভির জন্য একটি রিডএলটেক্সট এবং স্ট্রিমবফারের মধ্যে একটি তুলনা করেছি এবং দেখে মনে হচ্ছে যে পার্থক্যটি খুব কম তবে রিডআলটেক্সট সম্পূর্ণ ফাংশনগুলির জন্য নেওয়া সময় থেকে উপরের হাত ধরেছে বলে মনে হচ্ছে।