IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Suppression de ligne dans un gros fichier texte en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut Suppression de ligne dans un gros fichier texte en C
    Bonjour

    J'ai à traiter avec d'énormes fichiers texte de (1M à 10M) qui sont des BDD.
    Ce que je souhaite faire est simple:

    -Supprimer une ligne de ce fichier sans avoir à le réécrire completement. ce serai cool

    Pour l'instant je n'arrive qu'a me déplacer à l'indice ou se trouve ma ligne avec (fseek) et à écrire des espaces par dessus.

    N'y a t'il aucune fonction permettant de remplacer un caractere par rien du tout ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Un fichier est une suite de bytes. Vouloir remplacer un byte par "rien" n'a pas de sens en informatique : un byte contient toujours une valeur. C'est comme dans la mémoire : une case mémoire ne peut pas avoir "rien" dedans, il y a toujours une valeur. Dans un fichier, c'est le même principe.

    Le plus simple est justement de recréer un second fichier à partir du premier. Ensuite, de supprimer le premier et renommer le second.

    Seconde solution sinon, c'est de recopier tous les bytes à partir de l'emplacement correspondant à la ligne suivant celle à supprimer vers l'emplacement de la ligne à supprimer. Mais à ma connaissance, on ne pourra pas ensuite réduire la taille du fichier (?).

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par nilnog Voir le message
    -Supprimer une ligne de ce fichier sans avoir à le réécrire completement. ce serai cool
    Le C ne fournit pas cette capacite. Et les OS qui representent les fichiers textes sous un format le permettant existent mais je doute que tu les utilises (ni Windows, ni MacOS ni Unix n'en font partie, il faut aller voir du cote des OS de mini/mainframe)

    Citation Envoyé par jeroman Voir le message
    Mais à ma connaissance, on ne pourra pas ensuite réduire la taille du fichier (?).
    POSIX a truncate et ftruncate mais il n'y a rien dans la norme C.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Bonjour

    Merci pour vos réponses, je viens plus ou moins de résoudre le problème .
    J'utilise la méthode de réecriture complete mais sans passer par un autre fichier et en optimisant la lecture. J'explique le principe pour ceux que cela intéresse:

    -La ligne que je souhaite supprimée de trouve entre les indices A et B.
    -J'ouvre le fichier en lecture puis je lis deux gros blocs,l'un de 0 à A et l'autre de B à la fin du fichier. (fread)
    -Je ferme puis je réouvre mon fichier en ecriture
    -Je réécris les deux blocs.(fwrite)

    La ligne est alors supprimée avec un delais résonable. Faute de savoir faire mieux.

    Mais si quelqu'un à une meilleure solution je suis prenneur!

  5. #5
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par nilnog
    Mais si quelqu'un à une meilleure solution je suis prenneur!
    Oui, celle proprosée par jeroman.

  6. #6
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    Citation Envoyé par nilnog Voir le message
    Bonjour

    Merci pour vos réponses, je viens plus ou moins de résoudre le problème .
    J'utilise la méthode de réecriture complete mais sans passer par un autre fichier et en optimisant la lecture. J'explique le principe pour ceux que cela intéresse:

    -La ligne que je souhaite supprimée de trouve entre les indices A et B.
    -J'ouvre le fichier en lecture puis je lis deux gros blocs,l'un de 0 à A et l'autre de B à la fin du fichier. (fread)
    -Je ferme puis je réouvre mon fichier en ecriture
    -Je réécris les deux blocs.(fwrite)

    La ligne est alors supprimée avec un delais résonable. Faute de savoir faire mieux.

    Mais si quelqu'un à une meilleure solution je suis prenneur!
    Tu as tout de meme parcouru tout le fichier dans lequel se trouve la ligne a supprimer, n'est ce pas ce que tu voulais eviter ?

    C'est une bonne question, mais je crois pas qu'il y ai d'autre maniere.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Citation Envoyé par nilnog Voir le message
    -Je ferme puis je réouvre mon fichier en ecriture
    -Je réécris les deux blocs.(fwrite)
    Tu n'es pas obligé d'ouvrir et refermer à chaque fois le même fichier, ce qui est très coûteux en ressources. Tu peux ouvrir deux descripteurs vers le même fichier, un en lecture, l'autre en écriture.

    Tu peux également utiliser mmap() si l'O.S. qui tu utilises le reconnaît.

    Enfin, ce fil est utile car il montre comment on s'y prend pour supprimer des infos dans un fichier, mais s'il s'agit d'un problème concret pour toi et pas d'un cas d'étude, alors tu auras plus vite faire d'utiliser les outils à ta disposition plutôt qu'écrire un programme dédié en C. À mon avis, un simple grep -v sous Unix remplira parfaitement tes objectifs.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut
    Tu n'es pas obligé d'ouvrir et refermer à chaque fois le même fichier, ce qui est très coûteux en ressources. Tu peux ouvrir deux descripteurs vers le même fichier, un en lecture, l'autre en écriture.
    Ok je vais essayer mais je sais pas si c'est beaucoup mieux parce-que il y a qu'en même deux appels à fopen et deux fclose.

    Enfin, ce fil est utile car il montre comment on s'y prend pour supprimer des infos dans un fichier, mais s'il s'agit d'un problème concret pour toi et pas d'un cas d'étude, alors tu auras plus vite faire d'utiliser les outils à ta disposition plutôt qu'écrire un programme dédié en C. À mon avis, un simple grep -v sous Unix remplira parfaitement tes objectifs.
    Je suis entièrement d'accord mais la je suis contrains de programmer en C sous un environnement Windows . D'habitue suis sous unix et j'utilise Qt ou toutes ces fonctions sont déja implémentées en effet.

Discussions similaires

  1. modifier du texte dans un gros fichier texte
    Par christolb59 dans le forum MATLAB
    Réponses: 1
    Dernier message: 17/08/2012, 00h06
  2. suppression de lignes dans un fichier texte
    Par lerab51 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 23/10/2007, 11h23
  3. Suppression de lignes dans un fichier texte
    Par Isa31 dans le forum Langage
    Réponses: 16
    Dernier message: 26/01/2006, 20h07
  4. Réponses: 4
    Dernier message: 26/01/2006, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo