una txt texto separado por manejo lineas linea leer guardar especifica escribir ejemplos datos como comas archivos archivo agregar c# compact-framework

c# - txt - La mejor manera de leer un archivo en la lista<string>



leer y escribir archivos en c# (8)

Estoy utilizando una lista para limitar el tamaño del archivo, ya que el destino está limitado en disco y RAM. Esto es lo que estoy haciendo ahora, pero ¿hay una manera más eficiente?

readonly List<string> LogList = new List<string>(); ... var logFile = File.ReadAllLines(LOG_PATH); foreach (var s in logFile) LogList.Add(s);


¿Por qué no usar un generador en su lugar?

private IEnumerable<string> ReadLogLines(string logPath) { using(StreamReader reader = File.OpenText(logPath)) { string line = ""; while((line = reader.ReadLine()) != null) { yield return line; } } }

Entonces puedes usarlo como usarías la lista:

var logFile = ReadLogLines(LOG_PATH); foreach(var s in logFile) { // Do whatever you need }

Por supuesto, si necesita tener una List<string> , entonces deberá guardar todo el contenido del archivo en la memoria. Realmente no hay manera de evitar eso.


No lo guarde si es posible. Solo léelo si tienes memoria limitada. Puedes usar un StreamReader:

using (var reader = new StreamReader("file.txt")) { var line = reader.ReadLine(); // process line here }

Esto puede envolverse en un método que produzca cadenas por línea de lectura si desea usar LINQ.


Una pequeña actualización a la respuesta de Evan Mulawski para hacerla más corta.

List<string> allLinesText = File.ReadAllLines(fileName).ToList()


[Editar]

Si está haciendo esto para recortar el comienzo de un archivo de registro, puede evitar cargar todo el archivo haciendo algo como esto:

// count the number of lines in the file int count = 0; using (var sr = new StreamReader("file.txt")) { while (sr.ReadLine() != null) count++; } // skip first (LOG_MAX - count) lines count = LOG_MAX - count; using (var sr = new StreamReader("file.txt")) using (var sw = new StreamWriter("output.txt")) { // skip several lines while (count > 0 && sr.ReadLine() != null) count--; // continue copying string line = ""; while (line = sr.ReadLine() != null) sw.WriteLine(line); }

En primer lugar, dado que File.ReadAllLines carga todo el archivo en una matriz de string[] ( string[] ), copiar en una lista es redundante.

En segundo lugar, debe comprender que una List se implementa utilizando una matriz dinámica debajo del capó. Esto significa que CLR deberá asignar y copiar varias matrices hasta que pueda acomodar todo el archivo. Dado que el archivo ya está en el disco, puede considerar cambiar la velocidad por la memoria y trabajar directamente en los datos del disco, o procesarlo en trozos más pequeños.

  1. Si necesita cargarlo completamente en la memoria, al menos intente dejarlo en una matriz:

    string[] lines = File.ReadAllLines("file.txt");

  2. Si realmente necesita ser una List , cargue las líneas una por una:

    List<string> lines = new List<string>(); using (var sr = new StreamReader("file.txt")) { while (sr.Peek() >= 0) lines.Add(sr.ReadLine()); }

    Nota: la List<T> tiene un constructor que acepta un parámetro de capacidad. Si conoce el número de líneas por adelantado, puede evitar asignaciones múltiples preasignando la matriz por adelantado:

    List<string> lines = new List<string>(NUMBER_OF_LINES);

  3. Aún mejor, evite almacenar todo el archivo en la memoria y procesarlo "sobre la marcha":

    using (var sr = new StreamReader("file.txt")) { string line; while (line = sr.ReadLine() != null) { // process the file line by line } }


//this is only good in .NET 4 //read your file: List<string> ReadFile = File.ReadAllLines(@"C:/TEMP/FILE.TXT").ToList(); //manipulate data here foreach(string line in ReadFile) { //do something here } //write back to your file: File.WriteAllLines(@"C:/TEMP/FILE2.TXT", ReadFile);


string inLine = reader.ReadToEnd(); myList = inLine.Split(new string[] { "/r/n" }, StringSplitOptions.None).ToList();

También utilizo Environment.NewLine.toCharArray también, pero descubrí que no funcionó en un par de archivos que terminaron en / r / n. Prueba cualquiera de las dos y espero que te funcione bien.


var logFile = File.ReadAllLines(LOG_PATH); var logList = new List<string>(logFile);

Como logFile es una matriz, puede pasarlo al constructor List<T> . Esto elimina la sobrecarga innecesaria al iterar sobre la matriz o al usar otras clases de IO.

Implementación real del constructor :

public List(IEnumerable<T> collection) { ... ICollection<T> c = collection as ICollection<T>; if( c != null) { int count = c.Count; if (count == 0) { _items = _emptyArray; } else { _items = new T[count]; c.CopyTo(_items, 0); _size = count; } } ... }


List<string> lines = new List<string>(); using (var sr = new StreamReader("file.txt")) { while (sr.Peek() >= 0) lines.Add(sr.ReadLine()); }

Sugeriría esto ... de la respuesta de Groo.