Как прочитать весь файл в строку с помощью C #?
233116 просмотра
16 ответа
Какой самый быстрый способ прочитать текстовый файл в строковую переменную?
Я понимаю, что это можно сделать несколькими способами, например, прочитать отдельные байты, а затем преобразовать их в строку. Я искал метод с минимальным кодированием.
Автор: Shamim Hafiz Источник Размещён: 12.11.2019 09:07Ответы (16)
349 плюса
Как насчет
string contents = File.ReadAllText(@"C:\temp\test.txt");
Автор: marc_s
Размещён: 12.09.2011 11:24
162 плюса
Сравнение мерила 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<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;
}
Автор: Devendra D. Chavan
Размещён: 12.09.2011 11:40
16 плюса
6 плюса
Посмотрите на File.ReadAllText () метод
Некоторые важные замечания:
Автор: sll Размещён: 12.09.2011 11:25Этот метод открывает файл, читает каждую строку файла, а затем добавляет каждую строку как элемент строки. Затем он закрывает файл. Строка определяется как последовательность символов, за которой следует возврат каретки ('\ r'), перевод строки ('\ n') или возврат каретки, за которым сразу следует перевод строки. Результирующая строка не содержит завершающего возврата каретки и / или перевода строки.
Этот метод пытается автоматически определить кодировку файла на основании наличия меток порядка байтов. Форматы кодирования UTF-8 и UTF-32 (как с прямым порядком байтов, так и с прямым порядком байтов) могут быть обнаружены.
Используйте перегрузку метода ReadAllText (String, Encoding) при чтении файлов, которые могут содержать импортированный текст, поскольку нераспознанные символы могут читаться неправильно.
Этот метод гарантированно закрывает дескриптор файла, даже если возникают исключения
5 плюса
string text = File.ReadAllText("Path");
у вас есть весь текст в одной строковой переменной. Если вам нужна каждая строка отдельно, вы можете использовать это:
string[] lines = File.ReadAllLines("Path");
Автор: Dilshod
Размещён: 29.03.2013 06:34
4 плюса
System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
Автор: Maxim V. Pavlov
Размещён: 12.09.2011 11:24
4 плюса
@ Крис извините. Это цитата MSDN Microsoft
методология
В этом эксперименте будут сравниваться два класса. Класс StreamReader
and 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
чтение данных порциями, и активный разработчик мог бы написать немного больше логики, чтобы использовать поток в своих интересах. Если необходимые данные находятся в определенных позициях в файле, это, безусловно, путь, так как он уменьшает использование памяти.
FileStream
лучший механизм для скорости, но потребует больше логики.
3 плюса
Ну, самый быстрый способ, означающий наименьший возможный код C #, вероятно, таков:
string readText = System.IO.File.ReadAllText(path);
Автор: Davide Piras
Размещён: 12.09.2011 11:25
3 плюса
Если вы хотите выбрать файл из папки Bin приложения, попробуйте выполнить следующее и не забудьте выполнить обработку исключений.
string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));
Автор: Deeps
Размещён: 09.06.2014 10:24
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);
}
}
Автор: Erwin Draconis
Размещён: 31.03.2015 09:51
2 плюса
string content = System.IO.File.ReadAllText( @"C:\file.txt" );
Автор: Paul Mitchell
Размещён: 12.09.2011 11:25
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
}
}
Противостояв нескольким другим методам , он выигрывал большую часть времени, в том числе против BufferedReader.
Автор: user3810913 Размещён: 23.12.2014 07:462 плюса
Вы можете использовать как это
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 "";
}
}
Надеюсь, что это поможет вам.
Автор: Amit Kumawat Размещён: 23.06.2016 07:510 плюса
Вы также можете прочитать текст из текстового файла в строку следующим образом
string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
str = str + sr.ReadLine();
}
Автор: Sai Kalyan Kumar Akshinthala
Размещён: 12.09.2011 11:29
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);
}
}
}
}
}
}
Автор: JAY
Размещён: 10.07.2013 11:15
0 плюса
Я сделал сравнение между ReadAllText и StreamBuffer для 2 МБ csv, и казалось, что разница была довольно небольшой, но ReadAllText, похоже, взял верх над временем, затраченным на выполнение функций.
Автор: Hatitye Chindove Размещён: 06.12.2013 12:00Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- string В чем разница между строкой и строкой в ??C #?
- string Почему в Ruby нет реального StringBuffer или StringIO?
- string Преобразовать строку в перечисление в C #
- string Преобразование списка <Integer> в список <String>
- string Самый эффективный способ объединения строк?
- file-io Каков наилучший способ прочитать весь файл в std :: string в C ++?
- file-io Получить последние n строк файла с Python, похожего на tail
- file-io Как вы пишете конец файла, открытого с FILE_FLAG_NO_BUFFERING?
- file-io Как создать файл Excel (.XLS и .XLSX) в C # без установки MS Office?
- file-io Как мне создать временный файл с Какао?
- .net-3.5 LINQ-запрос к DataTable
- .net-3.5 Условные запросы Linq
- .net-3.5 Как разбирать строку в nullable int
- .net-3.5 Как присоединить int [] к символьно-разделенной строке в .NET?
- .net-3.5 Создание байтового массива из потока