Comment lire un fichier entier dans une chaîne en utilisant C #?

Quelle est la manière la plus rapide de lire un fichier texte dans une variable de chaîne?

Je comprends que cela peut être fait de plusieurs manières, comme lire des octets individuels, puis les convertir en chaîne. Je cherchais une méthode avec un codage minimal.

Que diriez-vous

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

Une comparaison de benchmark entre File.ReadAllLines et StreamReader ReadLine partir de la gestion de fichiers C #

Comparaison de lecture de fichier

Résultats. StreamReader est beaucoup plus rapide pour les fichiers volumineux de plus de 10 000 lignes, mais la différence pour les fichiers plus petits est négligeable. Comme toujours, prévoyez différentes tailles de fichiers et utilisez File.ReadAllLines uniquement lorsque les performances ne sont pas critiques.

Approche StreamReader

Comme l’approche File.ReadAllText a été suggérée par d’autres, vous pouvez également essayer plus rapidement (je n’ai pas testé quantitativement l’impact sur les performances, mais il semble être plus rapide que File.ReadAllText (voir comparaison ci-dessous)). La différence de performance ne sera visible que dans le cas de fichiers plus volumineux.

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

Comparaison de File.Readxxx () et StreamReader.Readxxx ()

Affichage du code indicatif via ILSpy J’ai trouvé ce qui suit à propos de File.ReadAllLines , File.ReadAllText .

  • File.ReadAllText – Utilise StreamReader.ReadToEnd interne
  • File.ReadAllLinesFile.ReadAllLines également StreamReader.ReadLine interne avec la surcharge supplémentaire de la création de List pour retourner en tant que lignes de lecture et en boucle jusqu’à la fin du fichier.

Les deux méthodes constituent donc une couche supplémentaire de commodité construite sur StreamReader . Cela est évident par le corps indicatif de la méthode.

File.ReadAllText() décompilée par ILSpy

 public static ssortingng ReadAllText(ssortingng path) { if (path == null) { throw new ArgumentNullException("path"); } if (path.Length == 0) { throw new ArgumentException(Environment.GetResourceSsortingng("Argument_EmptyPath")); } return File.InternalReadAllText(path, Encoding.UTF8); } private static ssortingng InternalReadAllText(ssortingng path, Encoding encoding) { ssortingng result; using (StreamReader streamReader = new StreamReader(path, encoding)) { result = streamReader.ReadToEnd(); } return result; } 
 ssortingng contents = System.IO.File.ReadAllText(path) 

Voici la documentation MSDN

Jetez un oeil à la méthode File.ReadAllText ()

Quelques remarques importantes:

Cette méthode ouvre un fichier, lit chaque ligne du fichier, puis ajoute chaque ligne en tant qu’élément d’une chaîne. Il ferme ensuite le fichier. Une ligne est définie comme une suite de caractères suivie d’un retour chariot (‘\ r’), d’un saut de ligne (‘\ n’) ou d’un retour chariot immédiatement suivi d’un saut de ligne. La chaîne résultante ne contient pas le retour chariot et / ou le saut de ligne.

Cette méthode tente de détecter automatiquement le codage d’un fichier en fonction de la présence de marques d’ordre d’octet. Les formats d’encodage UTF-8 et UTF-32 (big-endian et little-endian) peuvent être détectés.

Utilisez la surcharge de méthode ReadAllText (Ssortingng, Encoding) lors de la lecture de fichiers pouvant contenir du texte importé, car les caractères non reconnus peuvent ne pas être lus correctement.

Le handle de fichier est garanti pour être fermé par cette méthode, même si des exceptions sont déclenchées

ssortingng text = File.ReadAllText("Path"); vous avez tout le texte dans une variable de chaîne. Si vous avez besoin de chaque ligne individuellement, vous pouvez utiliser ceci:

 ssortingng[] lines = File.ReadAllLines("Path"); 

@Cris désolé .C’est une citation de MSDN Microsoft

Méthodologie

Dans cette expérience, deux classes seront comparées. Le StreamReader et la classe FileStream seront dirigés pour lire deux fichiers de 10K et 200K dans leur intégralité à partir du répertoire de l’application.

 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.GetSsortingng(b, 0, b.Length) Loop fs.Close() 

Résultat

entrer la description de l'image ici

FileStream est évidemment plus rapide dans ce test. Il faut 50% de temps supplémentaire à StreamReader pour lire le petit fichier. Pour le fichier volumineux, il a fallu 27% de plus.

StreamReader recherche spécifiquement les sauts de ligne, contrairement à FileStream . Cela représentera une partie du temps supplémentaire.

Recommandations

Selon ce que l’application doit faire avec une section de données, une parsing supplémentaire peut nécessiter un temps de traitement supplémentaire. Envisagez un scénario dans lequel un fichier contient des colonnes de données et les lignes sont délimitées par CR/LF . StreamReader fonctionnera dans la ligne de texte à la recherche du CR/LF , puis l’application effectuera une parsing supplémentaire à la recherche d’un emplacement de données spécifique. (Avez-vous pensé Ssortingng. SubSsortingng est livré sans prix?)

D’autre part, FileStream lit les données en morceaux et un développeur proactif pourrait écrire un peu plus de logique pour utiliser le stream à son avantage. Si les données nécessaires se trouvent dans des positions spécifiques du fichier, c’est certainement la voie à suivre, car cela permet de limiter l’utilisation de la mémoire.

FileStream est le meilleur mécanisme pour la vitesse mais prendra plus de logique.

 System.IO.StreamReader myFile = new System.IO.StreamReader("c:\\test.txt"); ssortingng mySsortingng = myFile.ReadToEnd(); 

bien le moyen le plus rapide signifiant avec le code C # le moins possible est probablement celui-ci:

 ssortingng readText = System.IO.File.ReadAllText(path); 

Si vous voulez choisir le fichier du dossier Bin de l’application, vous pouvez essayer de suivre et ne pas oublier de gérer les exceptions.

 ssortingng content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt")); 
 ssortingng content = System.IO.File.ReadAllText( @"C:\file.txt" ); 

Pour les noobs qui trouvent ce genre de choses amusant et intéressant, le moyen le plus rapide de lire un fichier entier dans une chaîne dans la plupart des cas ( selon ces tests ) est le suivant:

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

Cependant, le plus rapide pour lire un fichier texte semble être le suivant:

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

Contre plusieurs autres techniques , il a gagné la plupart du temps, y compris contre le BufferedReader.

vous pouvez utiliser :

  public static void ReadFileToEnd() { try { //provide to reader your complete text file using (StreamReader sr = new StreamReader("TestFile.txt")) { Ssortingng line = sr.ReadToEnd(); Console.WriteLine(line); } } catch (Exception e) { Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); } } 

Vous pouvez utiliser comme ça

 public static ssortingng ReadFileAndFetchSsortingngInSingleLine(ssortingng file) { SsortingngBuilder sb; try { sb = new SsortingngBuilder(); using (FileStream fs = File.Open(file, FileMode.Open)) { using (BufferedStream bs = new BufferedStream(fs)) { using (StreamReader sr = new StreamReader(bs)) { ssortingng str; while ((str = sr.ReadLine()) != null) { sb.Append(str); } } } } return sb.ToSsortingng(); } catch (Exception ex) { return ""; } } 

J’espère que ceci vous aidera.

vous pouvez lire un texte à partir d’un fichier texte dans la chaîne comme suit aussi

 ssortingng 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(ssortingng Inputssortingng); protected void Page_Load(object sender, EventArgs e) { getcontent(@"C:\Working\Teradata\New folder"); } private void SendDataToDB(ssortingng 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(ssortingng path) { ssortingng[] files; files = Directory.GetFiles(path, "*.txt"); SsortingngBuilder sbData = new SsortingngBuilder(); SsortingngBuilder sbErrorData = new SsortingngBuilder(); Testfile df = new Testfile(); DelegateWriteToDB objDelegate = new DelegateWriteToDB(df.SendDataToDB); //dt.Columns.Add("Data",Type.GetType("System.Ssortingng")); foreach (ssortingng file in files) { using (StreamReader sr = new StreamReader(file)) { Ssortingng line; int linelength; ssortingng space = ssortingng.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); } } } } } } 

J’ai fait une comparaison entre un ReadAllText et un StreamBuffer pour un csv de 2 Mo et il semblait que la différence était assez faible, mais ReadAllText semblait prendre le dessus sur les temps nécessaires pour terminer les fonctions.