web-dev-qa-db-fra.com

C # Comment sauter un nombre de lignes lors de la lecture d'un fichier texte à l'aide de Stream Reader?

J'ai un programme qui lit un fichier texte et le traite pour le séparer en sections.

La question est donc de savoir comment le programme peut être modifié pour permettre au programme de ne pas lire les 5 premières lignes du fichier tout en utilisant Stream Reader pour lire le fichier.

Quelqu'un pourrait-il donner des conseils sur les codes? Merci!

Les codes:

class Program
{
    static void Main(string[] args)
    {
        TextReader tr = new StreamReader(@"C:\Test\new.txt");

        String SplitBy = "----------------------------------------";

        // Skip first 5 lines of the text file?
        String fullLog = tr.ReadToEnd();

        String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);

        //String[] lines = sections.Skip(5).ToArray();

        foreach (String r in sections)
        {
            Console.WriteLine(r);
            Console.WriteLine("============================================================");
        }
    }
}
15
JavaNoob

Essayez ce qui suit

// Skip 5 lines
for(var i = 0; i < 5; i++) {
  tr.ReadLine();
}

// Read the rest
string remainingText = tr.ReadToEnd();
24
JaredPar

Si les lignes sont fixes, le moyen le plus efficace est le suivant:

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    stream.Seek(bytesPerLine * (myLine - 1), SeekOrigin.Begin);
    using( StreamReader reader = new StreamReader(stream) )
    {
        string line = reader.ReadLine();
    }
}

Et si les lignes varient en longueur, vous devrez simplement les lire ligne par ligne comme suit:

using (var sr = new StreamReader("file"))
{
    for (int i = 1; i <= 5; ++i)
        sr.ReadLine();
}
9
phillip

Si vous souhaitez l'utiliser plusieurs fois dans votre programme, il peut être judicieux de créer une classe personnalisée héritée de StreamReader avec la possibilité de sauter des lignes.

Quelque chose comme ça pourrait faire:

class SkippableStreamReader : StreamReader
{
    public SkippableStreamReader(string path) : base(path) { }

    public void SkipLines(int linecount)
    {
        for (int i = 0; i < linecount; i++)
        {
            this.ReadLine();
        }
    }
}

après cela, vous pourrez utiliser la fonction SkippableStreamReader pour sauter des lignes. Exemple:

SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read");

//do stuff
//and when needed
exampleReader.SkipLines(number_of_lines_to_skip);
7
Isti115

Je vais ajouter deux autres suggestions à la liste.

S'il y aura toujours un fichier et que vous ne ferez que lire, je suggère ceci:

var lines = File.ReadLines(@"C:\Test\new.txt").Skip(5).ToArray();

File.ReadLines ne bloque pas le fichier des autres et ne charge que dans la mémoire les lignes nécessaires.

Si votre flux peut provenir d'autres sources, je suggère cette approche:

class Program
{
    static void Main(string[] args)
    {
        //it's up to you to get your stream
        var stream = GetStream();

        //Here is where you'll read your lines. 
        //Any Linq statement can be used here.
        var lines = ReadLines(stream).Skip(5).ToArray();

        //Go on and do whatever you want to do with your lines...
    }
}

public IEnumerable<string> ReadLines(Stream stream)
{
    using (var reader = new StreamReader(stream))
    {
        while (!reader.EndOfStream)
        {
            yield return reader.ReadLine();
        }
    }
}

Le bloc Itérateur se nettoie automatiquement une fois que vous avez terminé. Ici est un article de Jon Skeet qui décrit en détail comment cela fonctionne (faites défiler jusqu'à la section "Et enfin ...").

4
Mark Rucker

Je suppose que c'est aussi simple que:

    static void Main(string[] args)
    {
        var tr = new StreamReader(@"C:\new.txt");

        var SplitBy = "----------------------------------------";

        // Skip first 5 lines of the text file?
        foreach (var i in Enumerable.Range(1, 5)) tr.ReadLine();
        var fullLog = tr.ReadToEnd(); 

        String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);

        //String[] lines = sections.Skip(5).ToArray();

        foreach (String r in sections)
        {
            Console.WriteLine(r);
            Console.WriteLine("============================================================");
        }
    }
0
Bruno Brant