wake-up-neo.net

Wie kann ich mit C # eine ganze Datei in einen String lesen?

Was ist der schnellste Weg, um eine Textdatei in eine String-Variable einzulesen?

Ich verstehe, dass dies auf verschiedene Arten erfolgen kann, z. B. indem einzelne Bytes gelesen und dann in Zeichenfolgen konvertiert werden. Ich suchte nach einer Methode mit minimaler Codierung.

192
Shamim Hafiz

Wie wäre es mit

string contents = File.ReadAllText(@"C:\temp\test.txt");
345
marc_s

Ein Benchmark-Vergleich von File.ReadAllLines Vs StreamReader ReadLine Aus C # -Dateibehandlung

File Read Comparison

Ergebnisse. StreamReader ist viel schneller für große Dateien mit mehr als 10.000 Zeilen, aber der Unterschied für kleinere Dateien ist vernachlässigbar. Planen Sie wie immer unterschiedliche Dateigrößen ein und verwenden Sie File.ReadAllLines nur, wenn die Leistung nicht kritisch ist.


StreamReader-Ansatz

Da der File.ReadAllText - Ansatz von anderen vorgeschlagen wurde, können Sie auch schneller (Ich habe die Auswirkungen auf die Leistung nicht quantitativ getestet, aber er scheint schneller als File.ReadAllText (Siehe Vergleich unten)). Der nterschied in der Leistung ist jedoch nur bei größeren Dateien sichtbar.

string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
     readContents = streamReader.ReadToEnd();
}


Vergleich von StreamReader.Readxxx () vs File.Readxxx ()

Anzeigen des angezeigten Codes durch ILSpy Ich habe Folgendes zu File.ReadAllLines, File.ReadAllText Gefunden.

  • File.ReadAllText - Verwendet intern StreamReader.ReadToEnd
  • File.ReadAllLines - Verwendet auch intern StreamReader.ReadLine Mit dem zusätzlichen Aufwand, den List<string> Für die Rückgabe als die gelesenen Zeilen und Schleifen bis zum Ende der Datei.


Beide Methoden sind also eine zusätzliche Bequemlichkeitsebene, die auf StreamReader aufbaut. Dies geht aus dem Indikativkörper der Methode hervor.

File.ReadAllText() Implementierung wie von ILSpy dekompiliert

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;
}
162
string contents = System.IO.File.ReadAllText(path)

Hier ist das MSDN-Dokumentation

16
Neil Barnwell

Schauen Sie sich die File.ReadAllText () -Methode an

Einige wichtige Bemerkungen:

Diese Methode öffnet eine Datei, liest jede Zeile der Datei und fügt dann jede Zeile als Element einer Zeichenfolge hinzu. Anschließend wird die Datei geschlossen. Eine Zeile ist definiert als eine Folge von Zeichen, gefolgt von einem Wagenrücklauf ('\ r'), einem Zeilenvorschub ('\ n') oder einem Wagenrücklauf, unmittelbar gefolgt von einem Zeilenvorschub. Die resultierende Zeichenfolge enthält keinen abschließenden Wagenrücklauf und/oder Zeilenvorschub.

Diese Methode versucht, die Codierung einer Datei basierend auf dem Vorhandensein von Bytereihenfolgemarkierungen automatisch zu erkennen. Kodierungsformate UTF-8 und UTF-32 (sowohl Big-Endian als auch Little-Endian) können erkannt werden.

Verwenden Sie die Methodenüberladung ReadAllText (String, Encoding), wenn Sie Dateien lesen, die möglicherweise importierten Text enthalten, da nicht erkannte Zeichen möglicherweise nicht richtig gelesen werden.

Das Dateihandle wird durch diese Methode garantiert geschlossen, auch wenn Ausnahmen ausgelöst werden

6
sll

string text = File.ReadAllText("Path"); Sie haben den gesamten Text in einer Zeichenfolgenvariablen. Wenn Sie jede Zeile einzeln benötigen, können Sie dies verwenden:

string[] lines = File.ReadAllLines("Path");
5
Dilshod

@ Cris sorry. Dies ist Zitat MSDN Microsoft

Methodik

In diesem Experiment werden zwei Klassen verglichen. Die Klasse StreamReader und die Klasse FileStream werden angewiesen, zwei Dateien mit jeweils 10 KB und 200 KB vollständig aus dem Anwendungsverzeichnis zu lesen.

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()

Ergebnis

enter image description here

FileStream ist in diesem Test offensichtlich schneller. Es dauert weitere 50% länger, bis StreamReader die kleine Datei gelesen hat. Für die große Datei wurden zusätzliche 27% der Zeit benötigt.

StreamReader sucht speziell nach Zeilenumbrüchen, FileStream nicht. Dies wird einen Teil der zusätzlichen Zeit ausmachen.

Empfehlungen

Abhängig davon, was die Anwendung mit einem Datenabschnitt tun muss, kann es zu einer zusätzlichen Analyse kommen, die zusätzliche Verarbeitungszeit erfordert. Stellen Sie sich ein Szenario vor, in dem eine Datei Datenspalten enthält und die Zeilen durch CR/LF Getrennt sind. Das StreamReader würde die Textzeile abarbeiten und nach dem CR/LF Suchen, und dann würde die Anwendung ein zusätzliches Parsing durchführen, um nach einem bestimmten Speicherort für Daten zu suchen. (Hast du gedacht, String. SubString kommt ohne Preis?)

Auf der anderen Seite liest FileStream die Daten in Blöcken und ein proaktiver Entwickler könnte etwas mehr Logik schreiben, um den Stream zu seinem Vorteil zu nutzen. Wenn sich die benötigten Daten an bestimmten Positionen in der Datei befinden, ist dies mit Sicherheit der richtige Weg, um die Speichernutzung zu verringern.

FileStream ist der bessere Mechanismus für die Geschwindigkeit, benötigt aber mehr Logik.

4
MinhVuong
System.IO.StreamReader myFile =
   new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
4
Maxim V. Pavlov

sie können verwenden:

 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);
    }
}
3
Erwin Draconis

wenn Sie eine Datei aus dem Ordner Bin der Anwendung auswählen möchten, können Sie Folgendes versuchen und die Ausnahmebehandlung nicht vergessen.

string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));
3
Deeps

nun, der schnellste Weg mit dem geringstmöglichen C # -Code ist wahrscheinlich dieser:

string readText = System.IO.File.ReadAllText(path);
3
Davide Piras

Sie können so verwenden

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 "";
        }
    }

Hoffe das wird dir helfen.

2
Amit Kumawat

Für die Noobs da draußen, die dieses Zeug lustig und interessant finden, ist der schnellste Weg, eine ganze Datei in den meisten Fällen in einen String zu lesen ( gemäß diesen Benchmarks ), der folgende:

using (StreamReader sr = File.OpenText(fileName))
{
        string s = sr.ReadToEnd();
}
//you then have to process the string

Das absolut schnellste Lesen einer Textdatei insgesamt scheint jedoch das Folgende zu sein:

using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
               //do what you have to here
        }
}

Stellen Sie sich gegen mehrere andere Techniken , es hat die meiste Zeit gewonnen, auch gegen den BufferedReader.

2
user3810913
string content = System.IO.File.ReadAllText( @"C:\file.txt" );
2
Paul Mitchell

sie können einen Text aus einer Textdatei wie folgt in eine Zeichenfolge einlesen

string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
  str = str + sr.ReadLine();
}

Ich habe einen Vergleich zwischen einem ReadAllText und einem StreamBuffer für eine 2-MB-CSV-Datei durchgeführt, und es schien, dass der Unterschied recht gering war, aber ReadAllText schien die Oberhand über die Zeiten zu behalten, in denen Funktionen ausgeführt wurden.

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);
                      }

                  }
              }
          }
      }
    }
0
JAY