72 votes

Comment puis-je lire une ligne spécifiée dans un fichier texte?

Compte tenu d'un fichier texte, comment pourrais-je aller sur la lecture d'une ligne arbitraire, et rien d'autre dans le fichier?

Dites, j'ai un fichier test.txt. Comment pourrais-je aller sur la lecture numéro de la ligne 15 dans le fichier?

Tout ce que j'ai vu, c'est des trucs impliquant le stockage de l'intégralité du fichier texte comme un tableau de Chaîne, puis en utilisant la valeur du numéro de ligne que le numéro de la Chaîne à utiliser à partir du tableau... mais il y a quelques complications: Le fichier texte est extrêmement grande et la machine que l'application que je suis le codage n'est pas exactement un top-notch système. La vitesse n'est pas la priorité, mais il est certainement un problème majeur.

Peut-on SEULEMENT de lire une ligne d'un fichier texte et de stocker le résultat dans une chaîne de caractères?

Merci pour vos réponses: Le fichier est un PEU structuré. Il a 25 lignes de l'info, et puis X lignes de chiffres, mais la ligne 17 des 25 premiers a la valeur de X.

Mais ensuite, il y a 1 ligne vide et il se répète tous les coins comme un deuxième enregistrement dans le fichier et X peut avoir une valeur différente pour chaque enregistrement.

Ce que je veux faire est de lire et de stocker les 25 premières lignes que les valeurs indépendant, puis stocker le prochain X (généralement autour de 250) et des lignes dans un tableau. Ensuite, je vais les stocker dans une base de données SQL et répétez avec l'enregistrement SUIVANT jusqu'à ce que j'arrive à la Yth record (le nombre d'enregistrements dans le fichier est dans la ligne 3)

EDIT 2: Très bien, je pense que j'ai obtenu dans une solution basée sur une combinaison de votre alls réponses.

Je vais lire les 25 premières lignes et de les stocker dans un tableau. Je vais copier le contenu pertinent de la matrice des variables locales alors je vais supprimer la première tranche de 25 lignes. Alors, je peux utiliser les informations à stocker le prochain X lignes (la valeur de l'article 13 dans le tableau) comme un tableau, le sérialiser, de le stocker dans une base de données, puis de supprimer les lignes que je viens de lire.

Je pourrais ensuite, répétez le processus pour chaque enregistrement suivant.

Bien sûr, cela repose sur une hypothèse que je fais, qui, pour être honnête, je ne suis pas sûr, c'est vrai. Est-il possible de supprimer le premier n lignes à partir d'un fichier texte à partir de C# sans avoir à le lire en entier et de le ré-écrire sans que le premier n lignes?

119voto

Mehrdad Afshari Points 204872

.NET 4.0 modifier

Depuis .NET 4.0, il est possible d'accéder à une seule ligne d'un fichier directement. Par exemple, pour accéder à la ligne 15:

string line = File.ReadLines(FileName).Skip(14).Take(1).First();

Ce sera de retour que la ligne nécessaire


Puisque vous ne pouvez pas prévoir l'emplacement (vous?) de la i-ème ligne dans le fichier, vous aurez à lire toutes les lignes précédentes aussi. Si le numéro de la ligne est faible, cela peut être plus efficace que l' ReadAllLines méthode.

string GetLine(string fileName, int line)
{
   using (var sr = new StreamReader(fileName)) {
       for (int i = 1; i < line; i++)
          sr.ReadLine();
       return sr.ReadLine();
   }
}

12voto

Dave Downs Points 4677

Si chaque ligne est une longueur fixe, alors vous pouvez ouvrir un Flux autour d'elle, seek (octets par ligne) * n dans le fichier et de lire votre ligne à partir de là.

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();
    }
}

Alternativement, vous pouvez simplement utiliser le StreamReader pour lire les lignes jusqu'à ce que vous avez trouvé celui que vous vouliez. De cette façon est plus lent, mais toujours une amélioration par rapport à la lecture de chaque ligne.

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    using( StreamReader reader = new StreamReader(fileStream) )
    {
        string line = null;
        for( int i = 0; i < myLineNumber; ++i )
        {
            line = reader.ReadLine();
        }
    }
}

8voto

JaredPar Points 333733

Non, malheureusement il n'y est pas. Lors de la crue au niveau des fichiers ne fonctionnent pas sur un numéro de la ligne de base. Au lieu de travailler à la position / position de base. Le système de fichiers racine n'a pas de notion de lignes. C'est un concept ajouté par la hausse du niveau des composants.

Donc, il n'y a aucun moyen de dire le système d'exploitation, veuillez ouvrir le fichier à la ligne bla. Au lieu de cela, vous devez ouvrir le fichier et sauter autour de comptage de nouvelles lignes jusqu'à ce que vous avez passé le numéro spécifié. Puis magasin, la prochaine série d'octets dans un tableau jusqu'à ce que vous atteignez la ligne suivante.

3voto

Ron Warholic Points 7479

Sauf si vous avez fixé la taille des lignes, vous devez lire chaque ligne jusqu'à ce que vous atteignez la ligne que vous souhaitez. Bien que, vous n'avez pas besoin de stocker chaque ligne, juste le jeter si ce n'est pas la ligne que vous désirez.

Edit:

Comme mentionné, il serait également possible de rechercher dans le fichier si les longueurs de ligne étaient prévisibles, c'est-à-dire que vous pourriez appliquer certains déterministe de la fonction de transformer un numéro de ligne dans un fichier de position.

1voto

Sallu_Mia Points 106

LIRE CINQ LIGNES à CHAQUE FOIS, il suffit de mettre votre déclaration si la déclaration , c'est ça

        String str1 = @"C:\Users\TEMP\Desktop\StaN.txt";   

        System.IO.StreamReader file = new System.IO.StreamReader(str1);

        line = file.ReadLine();

        Int32 ctn=0;

        try
        {

            while ((line = file.ReadLine()) != null)
            {

                    if (Counter == ctn)
                    {
                        MessageBox.Show("I am here");
                        ctn=ctn+5;
                        continue;
                    }
                    else
                    {
                        Counter++;
                        //MessageBox.Show(Counter.ToString());
                        MessageBox.Show(line.ToString());
                    } 
                }

            file.Close();
        }
        catch (Exception er)
        {

        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X