Каков самый быстрый способ чтения текстового файла в строковой переменной?
Я понимаю, что это можно сделать несколькими способами, такими как чтение отдельных байтов, а затем преобразование их в строку. Я искал метод с минимальным кодированием.
Каков самый быстрый способ чтения текстового файла в строковой переменной?
Я понимаю, что это можно сделать несколькими способами, такими как чтение отдельных байтов, а затем преобразование их в строку. Я искал метод с минимальным кодированием.
Как насчет
string contents = File.ReadAllText(@"C:\temp\test.txt");
Сравнительное сравнение File.ReadAllLines
vs StreamReader ReadLine
с Обработка файлов С#
Результаты. 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()
реализация как декомпилированная 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;
}
string contents = System.IO.File.ReadAllText(path)
Здесь документация MSDN
Взгляните на метод File.ReadAllText()
Некоторые важные замечания:
Этот метод открывает файл, читает каждую строку файла, а затем добавляет каждая строка как элемент строки. Затем он закрывает файл. Линия определяется как последовательность символов, за которой следует возврат каретки ('\ r'), прямой канал ('\n') или возврат каретки сразу же по линии. Полученная строка не содержит завершающего возврат каретки и/или подача строки.
Этот метод пытается автоматически определить кодировку файла основанный на наличии знаков порядка байтов. Форматы кодирования UTF-8 и UTF-32 (как для большого, так и для малознакового) может быть обнаружен.
Использовать метод ReadAllText (String, Encoding) при чтении файлы, которые могут содержать импортированный текст, поскольку непризнанные символы могут быть неправильно прочитаны.
Этот дескриптор файла может быть закрыт этим методом, даже если исключения возникают
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();
@Извините. Это цитата 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. SubString поставляется без цены?)
С другой стороны, FileStream
считывает данные в кусках, а проактивный разработчик может написать немного больше логики для использования потока в свою пользу. Если необходимые данные находятся в определенных позициях в файле, это, безусловно, путь, так как он сохраняет использование памяти.
FileStream
- лучший механизм для скорости, но требует больше логики.
ну, самый быстрый способ с наименьшим возможным кодом С#, вероятно, следующий:
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, казалось, взял верх от времени, затраченного на выполнение функций.