วิธีที่เร็วที่สุดในการอ่านไฟล์ข้อความในตัวแปรสตริงคืออะไร?
ฉันเข้าใจว่าสามารถทำได้หลายวิธีเช่นอ่านแต่ละไบต์แล้วแปลงเป็นสตริง ฉันกำลังมองหาวิธีที่มีการเข้ารหัสน้อยที่สุด
วิธีที่เร็วที่สุดในการอ่านไฟล์ข้อความในตัวแปรสตริงคืออะไร?
ฉันเข้าใจว่าสามารถทำได้หลายวิธีเช่นอ่านแต่ละไบต์แล้วแปลงเป็นสตริง ฉันกำลังมองหาวิธีที่มีการเข้ารหัสน้อยที่สุด
คำตอบ:
เกี่ยวกับFile.ReadAllText
:
string contents = File.ReadAllText(@"C:\temp\test.txt");
StreamReader.ReadToEnd
มีประสิทธิภาพมากกว่า
StreamReader.ReadToEnd
ReadAllLines
ซึ่งคาดว่าจะเป็นในขณะที่หลังยังแยกข้อความออกเป็นเส้น แต่เรากำลังพูดถึงวิธีการที่แตกต่างกัน, ReadAllText
. คำตอบที่คุณพูดถึงแสดงให้เห็นว่าReadAllText
เพิ่งโทรStreamReader.ReadToEnd
ภายใน
การเปรียบเทียบเกณฑ์มาตรฐานของFile.ReadAllLines
vs StreamReader ReadLine
จากการจัดการไฟล์ C #
ผล. StreamReader เร็วกว่ามากสำหรับไฟล์ขนาดใหญ่ที่มี 10,000 บรรทัด แต่ความแตกต่างของไฟล์ขนาดเล็กนั้นเล็กน้อย เช่นเคยวางแผนสำหรับขนาดไฟล์ที่แตกต่างกันและใช้ File.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()
การดำเนินการตามที่ decompiled โดย ILSpy
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)
นี่คือเอกสาร MSDN
ลองดูที่File.ReadAllText ()วิธีการ
ข้อสังเกตที่สำคัญบางประการ:
วิธีนี้จะเปิดไฟล์อ่านแต่ละบรรทัดของไฟล์แล้วเพิ่มแต่ละบรรทัดเป็นองค์ประกอบของสตริง จากนั้นจะปิดไฟล์ บรรทัดถูกกำหนดเป็นลำดับของอักขระตามด้วย carriage return ('\ r'), line feed ('\ n') หรือ carriage return ในทันทีตามด้วย feed line สตริงผลลัพธ์ไม่ประกอบด้วยการขึ้นบรรทัดใหม่และ / หรือการป้อนบรรทัด
วิธีนี้จะพยายามตรวจจับการเข้ารหัสไฟล์โดยอัตโนมัติตามสถานะของเครื่องหมายคำสั่งซื้อไบต์ รูปแบบการเข้ารหัสสามารถตรวจพบ UTF-8 และ UTF-32 (ทั้งใหญ่และเล็ก)
ใช้เมธอด ReadAllText (สตริง, การเข้ารหัส) เกินพิกัดเมื่ออ่านไฟล์ที่อาจมีข้อความที่นำเข้าเนื่องจากอักขระที่ไม่รู้จักอาจอ่านไม่ถูกต้อง
ตัวจัดการไฟล์ถูกรับประกันว่าจะปิดโดยวิธีนี้แม้ว่าจะมีข้อยกเว้นเกิดขึ้น
string text = File.ReadAllText("Path");
คุณมีข้อความทั้งหมดในตัวแปรสตริงเดียว หากคุณต้องการแต่ละบรรทัดคุณสามารถใช้สิ่งนี้:
string[] lines = File.ReadAllLines("Path");
System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
@Cris ขอโทษนี่คือคำพูด 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
เห็นได้ชัดว่าเร็วขึ้นในการทดสอบนี้ ใช้เวลาเพิ่มอีก 50% ในStreamReader
การอ่านไฟล์ขนาดเล็ก สำหรับไฟล์ขนาดใหญ่ใช้เวลาเพิ่มขึ้น 27%
StreamReader
กำลังมองหาการแบ่งบรรทัดโดยเฉพาะในขณะที่FileStream
ไม่ บัญชีนี้จะใช้เวลาพิเศษ
ข้อเสนอแนะ
แอปพลิเคชันที่ต้องทำกับส่วนของข้อมูลอาจมีการแยกวิเคราะห์เพิ่มเติมที่จะต้องใช้เวลาในการประมวลผลเพิ่มเติม พิจารณาสถานการณ์ที่ไฟล์มีคอลัมน์ของข้อมูลและCR/LF
คั่นด้วยแถว สิ่งนี้StreamReader
จะทำงานในบรรทัดของข้อความที่ต้องการค้นหาCR/LF
จากนั้นแอปพลิเคชันจะทำการแยกวิเคราะห์เพิ่มเติมเพื่อค้นหาตำแหน่งของข้อมูลที่เฉพาะเจาะจง (คุณคิดว่า String สตริงย่อยมาโดยไม่มีราคาหรือไม่)
ในทางกลับกันการFileStream
อ่านข้อมูลเป็นกลุ่มและผู้พัฒนาเชิงรุกสามารถเขียนตรรกะเพิ่มเติมเล็กน้อยเพื่อใช้สตรีมเพื่อผลประโยชน์ของเขา หากข้อมูลที่ต้องการอยู่ในตำแหน่งที่เฉพาะเจาะจงในไฟล์นี่จะเป็นวิธีที่แน่นอนในการลดการใช้หน่วยความจำ
FileStream
เป็นกลไกที่ดีกว่าสำหรับความเร็ว แต่จะใช้ตรรกะมากกว่า
StreamReader.ReadToEnd
อะไร
วิธีที่เร็วที่สุดความหมายที่ดีที่สุดที่มีรหัส C # น้อยที่สุดน่าจะเป็นสิ่งนี้:
string readText = System.IO.File.ReadAllText(path);
หากคุณต้องการเลือกไฟล์จากโฟลเดอร์ Bin ของแอปพลิเคชันคุณสามารถลองทำตามและอย่าลืมจัดการข้อยกเว้น
string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));
คุณสามารถใช้ได้ :
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);
}
}
string content = System.IO.File.ReadAllText( @"C:\file.txt" );
สำหรับ noobs ออกมีผู้ที่พบสิ่งนี้สนุกและน่าสนใจวิธีที่เร็วที่สุดในการอ่านไฟล์ทั้งหมดเป็นสตริงในกรณีส่วนใหญ่ ( ตามมาตรฐานเหล่านี้ ) โดยต่อไปนี้:
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
}
}
วางกับเทคนิคอื่น ๆ หลายมันชนะเวลาส่วนใหญ่รวมถึงกับ BufferedReader
คุณสามารถใช้สิ่งนี้
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);
}
}
}
}
}
}
ฉันทำการเปรียบเทียบระหว่าง ReadAllText และ StreamBuffer สำหรับ 2Mb csv และดูเหมือนว่าความแตกต่างนั้นค่อนข้างเล็ก แต่ ReadAllText ดูเหมือนจะยกระดับขึ้นจากเวลาที่ทำหน้าที่ให้เสร็จสมบูรณ์