Как прочитать весь файл в строке с помощью C #?
Каков самый быстрый способ прочитать текстовый файл в строковой переменной?
Я понимаю, что это можно сделать несколькими способами, такими как чтение отдельных байтов, а затем преобразование их в строку. Я искал метод с минимальным кодированием.
- Обрезать символы в Java
- Обратить каждое отдельное слово строки «Hello World» с помощью Java
- Обработка текста на основе NLTK с помощью панд
- Почему char предпочитает использовать String для паролей?
- Почему я не могу написать строковый литерал, в то время как я * могу * написать строковый объект?
- Почему String.replaceAll () в java требует 4 слэша «\\\\» в regex, чтобы фактически заменить «\»?
- В чем разница между String и StringBuffer в Java?
- Использовать строку в корпусе переключателя в java
- Как разбить String на несколько значений?
- C оптимизация строковых литералов
- .NET / C # - преобразовать char в строку
- Разница между пустой и пустой ("") строкой Java
- Почему метод concat () Java не делает ничего?
Как насчет
string contents = File.ReadAllText(@"C:\temp\test.txt");
Сравнительное сравнение File.ReadAllLines
StreamReader ReadLine
с обработкой файлов C #
Результаты. StreamReader намного быстрее для больших файлов с более чем 10 000 строк, но разница в меньших файлах незначительна. Как всегда, планируйте различные размеры файлов и используйте File.ReadAllLines только тогда, когда производительность не является критичной.
Подход StreamReader
Поскольку подход File.ReadAllText
был предложен другими, вы также можете попробовать быстрее (я не тестировал количественное влияние производительности, но он, кажется, быстрее, чем File.ReadAllText
(см. Сравнение ниже)). Разница в производительности будет видна только в случае больших файлов.
string readContents; using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8)) { readContents = streamReader.ReadToEnd(); }
Сравнение File.Readxxx () и StreamReader.Readxxx ()
Просмотр индикативного кода через ILSpy Я нашел следующее о File.ReadAllLines
, File.ReadAllText
.
-
File.ReadAllText
– используетStreamReader.ReadToEnd
внутренне -
File.ReadAllLines
– также используетStreamReader.ReadLine
внутренне с дополнительными накладными расходами на созданиеList
для возврата в виде строк чтения и циклизации до конца файла.
Таким образом, оба метода – дополнительный уровень удобства, построенный поверх 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");
@ Крис извините. Это цитата из MSDN Microsoft
методология
В этом эксперименте будут сравниваться два classа. Класс 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
, а затем приложение будет выполнять дополнительный синтаксический анализ, ищущий конкретное местоположение данных. (Вы считали, что String. SubString поставляется без цены?)
С другой стороны, FileStream
считывает данные в кусках, а проактивный разработчик может написать немного больше логики, чтобы использовать stream в свою пользу. Если необходимые данные находятся в определенных позициях в файле, это, безусловно, путь, так как он уменьшает использование памяти.
FileStream
– лучший механизм для скорости, но требует большей логики.
System.IO.StreamReader myFile = new System.IO.StreamReader("c:\\test.txt"); string myString = myFile.ReadToEnd();
ну, самый быстрый способ с наименьшим возможным кодом C #, вероятно, следующий:
string readText = System.IO.File.ReadAllText(path);
если вы хотите выбрать файл из папки Bin приложения, вы можете попробовать следовать и не забывать делать обработку исключений.
string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));
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 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); } }
Вы можете так использовать
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, казалось, взял верх от времени, затраченного на выполнение функций.