c# - txt - vb net leer archivo de texto




¿Cómo leer el archivo de texto por un personaje particular separador de línea? (8)

Aunque dijiste "Usar StreamReader", ya que también dijiste "Mi caso, el archivo puede tener toneladas de registros ...", recomendaría probar SSIS. Es perfecto para lo que estás tratando de hacer. Puede procesar archivos muy grandes y especificar fácilmente los delimitadores de líneas / columnas.

Lectura de un archivo de texto usando el lector de flujo.

using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
     string line = sr.ReadLine();
}

Quiero forzar que el delimitador de línea sea \n not \r . Entonces, ¿cómo puedo hacer eso?


De acuerdo con la documentación:

http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline.aspx

Una línea se define como una secuencia de caracteres seguida de un avance de línea ("\ n"), un retorno de carro ("\ r"), o un retorno de carro seguido inmediatamente de un avance de línea ("\ r \ n").

De manera predeterminada, el método StreamReader ReadLine reconocerá una línea por ambos / cualquiera \ n o \ r


Este fragmento de código leerá una línea de un archivo hasta que encuentre "\ n".

using (StreamReader sr = new StreamReader(path)) 
{
     string line = string.Empty;
     while (sr.Peek() >= 0) 
     {
          char c = (char)sr.Read();
          if (c == '\n')
          {
              //end of line encountered
              Console.WriteLine(line);
              //create new line
              line = string.Empty;
          }
          else
          {
               line += (char)sr.Read();
          }
     }
}

Como este código lee carácter por carácter, funcionará con un archivo de cualquier longitud sin estar limitado por la memoria disponible.


Implementaría algo así como la respuesta de George, pero como método de extensión que evita cargar todo el archivo a la vez (no probado, pero algo como esto):

static class ExtensionsForTextReader
{
     public static IEnumerable<string> ReadLines (this TextReader reader, char delimiter)
     {
            List<char> chars = new List<char> ();
            while (reader.Peek() >= 0)
            {
                char c = (char)reader.Read ();

                if (c == delimiter) {
                    yield return new String(chars.ToArray());
                    chars.Clear ();
                    continue;
                }

                chars.Add(c);
            }
     }
}

Que luego podría usarse como:

using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
     foreach (var line in sr.ReadLines ('\n'))
           Console.WriteLine (line);
}

Necesitaba una solución que fuera hasta "\ r \ n" y no se detuviera en "\ n". La solución de jp1980 funcionó, pero fue extremadamente lenta en un archivo grande. Entonces, convertí la solución de Mike Sackton para leer hasta encontrar una cadena especificada.

public static string ReadToString(StreamReader sr, string splitString)
{        
    char nextChar;
    StringBuilder line = new StringBuilder();
    int matchIndex = 0;

    while (sr.Peek() > 0)
    {               
        nextChar = (char)sr.Read();
        line.Append(nextChar);
        if (nextChar == splitString[matchIndex])
        {
            if(matchIndex == splitString.Length - 1)
            {
                return line.ToString().Substring(0, line.Length - splitString.Length);
            }
            matchIndex++;
        }
        else
        {
            matchIndex = 0;
        }
    }

    return line.Length == 0 ? null : line.ToString();
}

Y se llama así ...

using (StreamReader reader = new StreamReader(file))
{
    string line;
    while((line = ReadToString(reader, "\r\n")) != null)
    {
        Console.WriteLine(line);
    }
}

O bien tiene que analizar la secuencia byte por byte usted mismo y manejar la división, o necesita usar el comportamiento ReadLine predeterminado que se divide en / r, / n, / / ​​r / n.

Si quieres analizar la transmisión byte a byte, usaría algo así como el siguiente método de extensión:

 public static string ReadToChar(this StreamReader sr, char splitCharacter)
    {        
        char nextChar;
        StringBuilder line = new StringBuilder();
        while (sr.Peek() > 0)
        {               
            nextChar = (char)sr.Read();
            if (nextChar == splitCharacter) return line.ToString();
            line.Append(nextChar);
        }

        return line.Length == 0 ? null : line.ToString();
    }


string text = sr.ReadToEnd();
string[] lines = text.Split('\r');
foreach(string s in lines)
{
   // Consume
}




file-handling