2010-01-20 38 views
6

¿cómo puedo saltar a alguna línea en mi archivo, por ejemplo, la línea 300 en c: \ text.txt?saltar a la línea de archivo C#

+2

¿Están las líneas terminadas? –

+0

terminado con qué? – aharon

+0

@aharont, un archivo es solo una secuencia de bytes almacenados en un disco duro. Debe especificar qué significa una * línea * en su caso. Por ejemplo, en los sistemas basados ​​en Linux, la nueva línea representada por el carácter '\ n' mientras está en Windows es la secuencia' \ r \ n'. –

Respuesta

1
Dim arrText() As String 
Dim lineThreeHundred As String 

arrText = File.ReadAllLines("c:\test.txt") 

lineThreeHundred = arrText(299) 

Editar: C# versión

string[] arrText; 
string lineThreeHundred; 

arrText = File.ReadAllLines("c:\test.txt"); 
lineThreeHundred = arrText[299]; 
12
using (var reader = new StreamReader(@"c:\test.txt")) 
{ 
    for (int i = 0; i < 300; i++) 
    { 
     reader.ReadLine(); 
    } 
    // Now you are at line 300. You may continue reading 
} 
+2

@Darin Dimitrov: "Ahora estás en la línea 300. Puedes continuar leyendo". ¡Ten cuidado si hay menos de 300 líneas! – jason

+2

@Jason, omití intencionadamente el manejo de excepciones para demostrar el proceso * de saltar a una línea * en un archivo. La pregunta original no era cómo escribir código listo para producción que pueda copiar y pegar que saltará a una línea en un archivo. Hay muchas otras cosas de las que debemos ocuparnos, como verificar la existencia del archivo, verificar que la cuenta en la que se ejecuta nuestro proceso tenga permisos de lectura en el archivo, errores de registro, etc. ... –

+0

Whoa, es un gran salto al señalar que su comentario es un poco engañoso para interpretar mi comentario como si dijera que no es seguro para su uso en producción. – jason

9

archivos delimitados-Line no están diseñados para el acceso aleatorio. Por lo tanto, debe buscar en el archivo leyendo y descartando el número necesario de líneas.

enfoque moderno:

Uso:

// path is string 
int skip = 300; 
StreamReader sr = new StreamReader(path); 
using (var lineReader = new LineReader(sr)) { 
    IEnumerable<string> lines = lineReader.Skip(skip); 
    foreach (string line in lines) { 
     Console.WriteLine(line); 
    } 
} 

enfoque simple:

string path; 
int count = 0; 
int skip = 300; 
using (StreamReader sr = new StreamReader(path)) { 
    while ((count < skip) && (sr.ReadLine() != null)) { 
     count++; 
    } 
    if(!sr.EndOfStream) 
     Console.WriteLine(sr.ReadLine()); 
    } 
} 
0
/// <summary> 
/// Gets the specified line from a text file. 
/// </summary> 
/// <param name="lineNumber">The number of the line to return.</param> 
/// <param name="path">Identifies the text file that is to be read.</param> 
/// <returns>The specified line, is it exists, or an empty string otherwise.</returns> 
/// <exception cref="ArgumentException">The line number is negative, or the path is missing.</exception> 
/// <exception cref="System.IO.IOException">The file could not be read.</exception> 
public static string GetNthLineFromTextFile(int lineNumber, string path) 
{ 
    if (lineNumber < 0) 
     throw new ArgumentException(string.Format("Invalid line number \"{0}\". Must be greater than zero.", lineNumber)); 
    if (string.IsNullOrEmpty(path)) 
     throw new ArgumentException("No path was specified."); 

    using (System.IO.StreamReader reader = new System.IO.StreamReader(path)) 
    { 
     for (int currentLineNumber = 0; currentLineNumber < lineNumber; currentLineNumber++) 
     { 
      if (reader.EndOfStream) 
       return string.Empty; 
      reader.ReadLine(); 
     } 
     return reader.ReadLine(); 
    } 
} 
1

Un par de cosas me di cuenta:

  1. Microsoft sample usage of the StreamReader constructor comprueba si el archivo existe primero.

  2. Usted debe notificar al usuario, a través de un mensaje de en la pantalla o en un registro, si el archivo o bien no existe o es más corto de lo que esperábamos. Esto permite que sepa sobre cualquier error inesperado, si ocurre mientras está depurando otras partes del sistema. Me di cuenta de que esto no era parte de su pregunta original , pero es una buena práctica .

Así que esta es una combinación de varias de las otras respuestas.

string path = @"C:\test.txt"; 
int count = 0; 

if(File.Exists(path)) 
{ 
    using (var reader = new StreamReader(@"c:\test.txt")) 
    { 
    while (count < 300 && reader.ReadLine() != null) 
    { 
     count++; 
    } 

    if(count != 300) 
    { 
     Console.WriteLine("There are less than 300 lines in this file."); 
    } 
    else 
    { 
     // keep processing 
    } 
    } 
} 
else 
{ 
    Console.WriteLine("File '" + path + "' does not exist."); 
} 
Cuestiones relacionadas