Как прочитать весь файл в строку с помощью C #?

c# string file-io .net-3.5

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 плюса

string contents = System.IO.File.ReadAllText(path)

Вот документация MSDN

Автор: Neil Barnwell Размещён: 12.09.2011 11:25

6 плюса

Посмотрите на File.ReadAllText () метод

Некоторые важные замечания:

Этот метод открывает файл, читает каждую строку файла, а затем добавляет каждую строку как элемент строки. Затем он закрывает файл. Строка определяется как последовательность символов, за которой следует возврат каретки ('\ r'), перевод строки ('\ n') или возврат каретки, за которым сразу следует перевод строки. Результирующая строка не содержит завершающего возврата каретки и / или перевода строки.

Этот метод пытается автоматически определить кодировку файла на основании наличия меток порядка байтов. Форматы кодирования UTF-8 и UTF-32 (как с прямым порядком байтов, так и с прямым порядком байтов) могут быть обнаружены.

Используйте перегрузку метода ReadAllText (String, Encoding) при чтении файлов, которые могут содержать импортированный текст, поскольку нераспознанные символы могут читаться неправильно.

Этот метод гарантированно закрывает дескриптор файла, даже если возникают исключения

Автор: sll Размещён: 12.09.2011 11:25

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

методология

В этом эксперименте будут сравниваться два класса. Класс StreamReaderand 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 лучший механизм для скорости, но потребует больше логики.

Автор: MinhVuong Размещён: 29.03.2013 05:53

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:46

2 плюса

Вы можете использовать как это

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:51

0 плюса

Вы также можете прочитать текст из текстового файла в строку следующим образом

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
Вопросы из категории :
32x32