Ce sujet est résolu.
1 | |
Auteur | Messages |
---|---|
Zoltic | #1 Posté le 31/1/2012 à 16:57:38 |
Bonjour, Dans la série "Les Nuls sont parmi nous" je vous propose le petit sujet suivant. J'ai besoin de lire des fichiers contenant des phrases indépendantes. Bien sur ces phrases ne sont délimitées par aucun marqueur connu du genre de CR ou LF. Mais...... elles ont tout de même un séparateur : chr$(0). J'ai bien pensé à des méthodes bestiales : - Lire tout le fichier d'un coup et ensuite découper mes lignes à grand renfort de "spit" pour les mettre dans un tableau - Faire une copie de travail puis y passer, par appel système, un coup de "sed" pour changer les marqueurs de fin de ligne et j'ai vu que avec l'instruction Line Input on parlait de "Stream.EndOfLine". je me suis dit : Chouette il va me suffire de dire au système quel est mon marqueur et le tour est joué. Déception..... snif.... Si j'ai bien compris cette propriété ne peut prendre que 3 valeurs prédéfinies et aucune, bien entendu, ne correspond à ce dont j'ai besoin. Je n'irais pas jusqu'à demander aux programmeurs de Gambas de prévoir tous les cas bizaroïdes qu'on peut trouver dans l'univers fou des programmeurs déments, ou géniaux, c'est souvent la même chose.... Quoique...... la possibilité de définir ses propres marqueurs serait un "must" incomparable. Non, plus prosaïquement existe-t-il un méthode moins bestiale que celles envisagées ci-dessus pour décortiquer ces #&!@ de fichiers qui ne respectent aucune norme ? Déjà qu'ils sont dans une matrice de caractères par classique et qu'il va falloir que je décode les é,è,ç,à,..... pour que les textes soient lisibles. Bonne journée. Point n'est besoin d'espérer pour entreprendre ni de réussir pour persévérer. Charles de Valois-Bourgogne, dit "le Téméraire". | |
linuxos | #2 Posté le 31/1/2012 à 17:21:06 |
Un peu de sel, de poivre et la crevette sera... | Bonjour Zoltic, Gambas traite nativement tout en UTF8 donc ce n'est pas la peine d’interpréter quoi que ce soit. Pour la lecture de ton fichier, peux tu nous donner un idée du volume que cela représente a lire car la fonction File.Load, puis split te fera ça très vite. Sinon il faudra ouvrir le fichier en lecture, lire séquentiellement bloc d'octet par bloc d'octet et couper tout cela au fur et a mesure pour le stocker dans un tableau. Olivier Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous. |
Zoltic | #3 Posté le 1/2/2012 à 02:50:39 |
Bonsoir linuxos, En ce qui concerne les caractères accentués c'est vraiment un truc pas commun. En fait ce sont de vieux fichiers, de l'époque où y'avait pas franchement de standard et où chaque développeur se faisait sa sauce pour passer les caractères "nationaux". En plus que c'était pas pour de l'affichage "texte" mais dans des systèmes graphiques. Mais c'est pas le problème de fond. La soluce de split, c'est très jouable effectivement, les fichiers font, en moyenne et à vu de pif, entre 20 et 30 phrases indépendantes. Mais.... Vu ce que je veux faire en final, il se pourrait que certains fassent de 200 à 300 phrases. Mais même, le temps de traitement n'est pas une question primordiale. Je vais passer, au final, plus de temps à programmer et à tester qu'à exécuter. C'est pour ça que j'ai choisi le basic de préférence au C, plus rapide parce que vraiment compilé mais tellement lourd à compiler justement, makefile ça va un moment mais c'est pas toujours très marrant. En fait je voulait savoir deux choses, la première, si quelqu'un avait une idée géniale, du genre de celle que l'on m'a filé pour lire mes fichiers binaires (File.Load), à ce propos j'ai vu nulle part dans la doc quoi que ce soit qui ressemble à cette solution. La seconde c'est si j'avais bien compris ce que j'avais lu, vu mon ignorance dans le domaine de "l'orienté objet" il n'était pas du tout impossible que j'ai rien pigé. J'apprends vite, mais me faut tout de même du temps. La méthode de la lecture octet par octet c'est déjà ce que l'on utilisait à l'époque héroïque et j'en ai programmé par douzaine des boucles de lecture. Mais faut tout de même avouer que c'est assez bestial comme procédé. Ceci dit, merci, je vais m'atteler à faire ça propre et efficace si ce n'est élégant. Tiens, question subsidiaire, pour mes fichiers binaires, j'ai utilisé la solution bête d'ouvrir le fichier "normalement", de récupérer la taille et de le refermer avant d'utiliser File.Load. Y'aurait pas un moyen plus élégant de faire ça ? Ça me serait utile pour les textes aussi. Point n'est besoin d'espérer pour entreprendre ni de réussir pour persévérer. Charles de Valois-Bourgogne, dit "le Téméraire". | |
manu | #4 Posté le 1/2/2012 à 08:19:28 |
Avec Gambas ca roule ! | Bonjour, Etant un brave programmeur amateur, je ne comprends pas bien ce que tu souhaites faire... Concernant les manipulation de fichier, je te conseil cette lecture de la doc : http://gambasdoc.org/help/cat/file?fr&view et ca en particulier http://gambasdoc.org/help/comp/gb/stat?fr. Concernant la lecture des "phrases" je pense que l'utilisation des "expressions regulières" (ou Regex) devraient t'être d'une grande aide . Tu as un tuto sur le site du Zero super bien fait : http://www.siteduzero.com/tutoriel-3-14608-les-expressions-regulieres-partie-1-2.html. Concernant gambas, il faut utiliser le composant gb.pcre : http://gambasdoc.org/help/comp/gb.pcre/regexp?fr&v3 Bon, je suis pas sure d'avoir compris alors, a toi de voir et de nous dire Jeanne d'arc, elle a frit, elle a tout compris ! Config : Manjaro linux (excellent !) XFCE 4.1 (simple et efficace) Gambas 3 dans les dépots (confort total) |
Zoltic | #5 Posté le 1/2/2012 à 19:38:09 |
Bonjour Manu, Il n'existe ni programmeur amateur ni autre, il n'existent que des programmeurs qui cherchent et parfois trouvent la meilleure solution. J'entends pas "meilleure", non seulement la plus efficace, mais aussi la plus élégante et la plus facile à maintenir en cas de modifications à apporter. Un programme bien structuré avec des procédures nettes et des actions précises est plus facile à débugger qu'un fouillis de machins qui s'entremêlent et une abondance de "goto" que certains ont bien connu. Ceci dit, mon problème n'est pas le traitement de chaine de caractères au sens strict du terme, c'est l'utilisation de fichiers contenant des caractères non standards, inclus dans un texte à afficher, sensés indiquer au programme lisant le fichier d'effectuer certaines actions. Un exemple très simple, quand tu trouves un "^K" suivi de 3 digits "xxx", le programme sait qu'il doit jouer la musique numéro "xxx" suivant certains paramètres. il est évident qu'il ne faut pas afficher ce genre d'info à l'écran. De même, le "^@" étant utilisé pour indiquer la fin de ligne, les "^M" doivent être préservés pour un traitement ultérieur. Et je ne parle pas des caractères accentués qui ont des codes encore plus "mystérieux". Mais ça c'est de la recherche de base dans un chaine avec remplacement des caractères exotiques suivant une table de transcodage. Un pure formalité. Ceci dit, j'ai utilisé la bonne vieille méthode qui consiste à lire le fichier séquentiellement, byte par byte et à remplir mon tableau de chaines en gérant le "^@". Comme quoi les vieilles méthodes ça se démode pas. Je ne sais pas comment ça se passe ici, mais pour moi le sujet est clôt, j'ai eu des réponses rapidement, bravo pour la réactivité. Je ne sais si c'est à moi de clore la discussion ou si c'est à un admin du forum de le faire. Chacun ses petites habitudes. Bonne journée à tous et toutes. Point n'est besoin d'espérer pour entreprendre ni de réussir pour persévérer. Charles de Valois-Bourgogne, dit "le Téméraire". | |
linuxos | #6 Posté le 1/2/2012 à 19:43:58 |
Un peu de sel, de poivre et la crevette sera... | C'est a toi de clore le sujet si tu estimes qu'il est terminé. Le bouton est en haut de la fenetre. Olivier Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous. |
Zoltic | #7 Posté le 1/2/2012 à 19:49:21 |
Merci, linuxos, je clos derechef. Point n'est besoin d'espérer pour entreprendre ni de réussir pour persévérer. Charles de Valois-Bourgogne, dit "le Téméraire". | |
1 |