Page 1 sur 2

Document Texte et PureBasic

Publié : mar. 14/sept./2010 18:17
par Dumli
Salut tout le monde :D

J'ai créé ce sujet car j'ai un problème avec mon programme. Je voudrais lire une ligne précise d'un document TXT mais à part lire tout le fichier je n'y arrive pas. Je voudrais en fait qu'une des lignes du document soit sélectionnée au Hasard et par la suite soit affichée. Le document TXT serait, en fait, composé d'une liste de mot avec à chaque fois des retours à la ligne pour chaque série de 3-4 mots.

Comme ceci :
Bla Bla Bla
Bla Bla Bla Bla
Bla Bla
:lol:

En fait, cela serait une sorte de "Base de Donnée"

En espérant avoir étais clair, :wink:

Re: Document Texte et PureBasic

Publié : mar. 14/sept./2010 21:44
par Ollivier
ça, c'est pour lire un fichier texte:

Code : Tout sélectionner

  If ReadFile(0, "Texte.txt")  ; Si le fichier peut être lu , on continue...
    While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
      Debug ReadString(0)      ; Affiche ligne par ligne le contenu du fichier
    Wend
    CloseFile(0)               ; Ferme le fichier précédemment ouvert
  Else
    MessageRequester("Information","Impossible d'ouvrir le fichier!")
  EndIf
Après, tu regarde Dim pour créer un tableau de chaînes qui contiendra la liste de lignes texte. Dim se mettra au départ du code.

Le but est de charger ton fichier texte en mémoire dans le tableau, donc il faudra modifier la ligne contenant "Debug ReadString(0)" correctement pour qu'au lieu de transférer les lignes texte du fichier vers l'écran, elles aillent du fichier vers le tableau.

Et une fois que c'est fait, il y a la fonction Random pour choper un nombre au hasard donc une ligne de texte au hasard dans le tableau chargé.

Re: Document Texte et PureBasic

Publié : mar. 14/sept./2010 23:31
par case
en fait le problème est que la taille en octet de chaque ligne est différente

bla bla bla > bla bla donc impossible de savoir d'avance ou commence telle ou telle ligne dans le fichier sans le lire. . .

mais si tes lignes sont toute de la même taille par exemple complétée par des espaces

"bonjour" (7 caracteres)
"hello " (5+2 espaces=7 caracteres)
"blah "(4+3 espaces=7 caracteres" etc...

tu peux effectivement lire la ligne que tu veux j'ai pris comme exemple une taille de 7 caracteres

Code : Tout sélectionner

rd=openfile(#pb_any,"basededonée.txt")
if rd

nombre_de_lignes=lof(rd)/7
fileseek(rd,random((nombre_de_lignes-1)*7))
debug readstring(rd)
closefile(rd)

inconvénient toute les lignes du fichier doivent impérativement avoir le même nombre d'octets , le fichier est donc plus volumineux qu'un fichier sans ce genre de contraintes.

Re: Document Texte et PureBasic

Publié : mer. 15/sept./2010 0:13
par Backup
si tu compte les chr(13) tu aura ton nombre de lignes non ? peut importe le nombre de caracteres donc .. :)

Re: Document Texte et PureBasic

Publié : mer. 15/sept./2010 9:28
par Jacobus
Comme ça. Adapter aux besoins précis pour automatiser l'action sur le bouton
-> Dans la boucle d'évènements : Remplacez file$ = "CHEMIN DE VOTRE FICHIER" par votre chemin de fichier perso

Code : Tout sélectionner

Enumeration
  #Win_
  #Btn_ReadFile
  #Textpresentation
  #TextAleatoire
  #Status
EndEnumeration

Procedure RandomReadfile(filename.s)
  
  count = 0
  If ReadFile(0,filename)     
    While Eof(0) = 0     
      alea$ = ReadString(0) 
      count = count + 1 
    Wend 
    CloseFile(0)
    StatusBarText(#Status, 0, "Fichier composé de :  "+Str(count)+" lignes")
    xline = Random(count)    
  Else
    MessageRequester("Information","Impossible d'ouvrir le fichier!")
  EndIf
  

  If ReadFile(0, filename)
    countline = 0
     While Eof(0) = 0     
        alea$ = ReadString(0) 
        countline = countline + 1
        If countline = xline
          StatusBarText(#Status, 1, "Ligne lue  : "+Str(countline))
            If alea$ = ""
              SetGadgetText(#TextAleatoire,"pas de mot du jour; espace vide; zut! raté.") ; si une ligne est vide on remplace par autre chose
            Else 
              SetGadgetText(#TextAleatoire,alea$)
            EndIf            
          Break
        EndIf      
      Wend         
    CloseFile(0)   
  Else
    MessageRequester("Information","Impossible d'ouvrir le fichier!")
  EndIf

EndProcedure


If OpenWindow(#Win_,0,0,400,130,"Alea jacta est", #PB_Window_SystemMenu |#PB_Window_ScreenCentered |#PB_Window_TitleBar)=0  
  End 
Else
  
  If LoadFont(0,"Time new Roman",10,#PB_Font_Bold|#PB_Font_HighQuality)
    Font = FontID(0)
  Else 
    Font = #PB_Default
  EndIf 
  
  TextGadget(#Textpresentation,20,20,150,15,"les mots du jour :")
  ButtonGadget(#Btn_ReadFile,240,15,150,25,"lecture aléatoire")
  
  TextGadget(#TextAleatoire,20,50,360,45,"")
  SetGadgetFont(#TextAleatoire, Font)

    If CreateStatusBar(#Status, WindowID(#Win_))
      AddStatusBarField(#PB_Ignore)
      AddStatusBarField(#PB_Ignore)      
    EndIf
    StatusBarText(#Status, 0, "Fichier composé de : ")
    StatusBarText(#Status, 1, "Ligne lue : ")

    
  Repeat
   Event = WaitWindowEvent() 
    If Event = #PB_Event_Gadget
      Select EventGadget() 
          
        Case #Btn_ReadFile  
             file$ = "CHEMIN DE VOTRE FICHIER"
                RandomReadfile(file$)      
                  
                 
      EndSelect
    EndIf 
    
  Until Event = #PB_Event_CloseWindow
End 
EndIf 

Re: Document Texte et PureBasic

Publié : mer. 15/sept./2010 10:43
par Scrat
Tu peux aussi utiliser Sqlite

une table avec un seul champ de type varchar

Comme ça tu peux faire ce que tu veux sans avoir a parser le fichier.

A+

Re: Document Texte et PureBasic

Publié : mer. 15/sept./2010 14:03
par Dumli
Merci pour les réponses rapides et claires ! :D Je vais étudier tout ça :wink:

Re: Document Texte et PureBasic

Publié : ven. 17/sept./2010 20:52
par Dumli
"ReBonjour" tout le Monde, :D
J'ai réussit à mettre le contenue du Fichier texte dans un tableau.
Mon problème maintenant est que je voudrais séparer certaines partie en colonnes comme cela :

Bla Bli Blo
Bla Bli Bli Blo Blo
Bla Bli Blo Blo

Et je voudrais un tableau avec : :roll:

____Cln 1 Cln 2 Cln 3
Lgn1 Bla | Bli | Blo
Lgn2 Bla | Bli Bli | Blo Blo
Lgn3 Bla | Bli | Blo Blo

En sachant que les lignes je les ai déjà, mon problème est : Au moment de la lecture du fichier, il faudrait trouver une solution pour arriver à associer les BLA à la colonne 1, les BLI à la colonne 2, ...

J'ai pensé à faire, dans mon fichier txt, des séparation du type | ou ; pour être facilement repérable et par conséquent rendre le "trillage" plus aisée. :|

Je suis entrain d'essayer de faire fonctionner ce système :
En fait, dés que FindString() renvoie une réponse la valeur c (colonne) s'incrémente de 1. Ensuite, je n'ai plus qu'a faire une fonction pour que c fasse 1,2,3,1,2,3,1,2,3,1,2,3, .... Comme ça, dans mon fichier, je met un ";" dés que je veux que sa change de colonne. Sauf que le code n'est pas trop fonctionnel ... :?

Code : Tout sélectionner

If ReadFile(0,"Test.txt")
  While Eof(0) = 0 ;Regarde combien de ligne est constitué le Fichier TXT
    ReadString(0)
    l+1
  Wend
  Dim Liste.s(3,l) ;Crée le tableau en fonction du nombre de Ligne (l)
  l=1
  c=1
  FileSeek(0,0) ;Replace le curseur au début du fichier
  While Eof(0) = 0
    Debug position
    Delay(2000)
    If position = FindString(ReadString(0),";",1) ;Cherche le caractère ";"
      c+1   
    EndIf
  Wend
EndIf
Voila, merci d'avance :mrgreen:

Re: Document Texte et PureBasic

Publié : sam. 18/sept./2010 18:00
par Dumli
:arrow:

Re: Document Texte et PureBasic

Publié : sam. 18/sept./2010 18:18
par Backup
faudrai voir a regarder la fonction stringField() ;)

Re: Document Texte et PureBasic

Publié : sam. 18/sept./2010 18:24
par Dumli
Je suis déjà entrain d'y plancher dessus mais le problème est que je suis obligé d'écrire 2fois ReadString() donc il me lit mal le fichier ...

Re: Document Texte et PureBasic

Publié : sam. 18/sept./2010 19:47
par Backup
......................

Re: Document Texte et PureBasic

Publié : dim. 19/sept./2010 19:05
par Dumli
Merci, je vais voir tous ça

Re: Document Texte et PureBasic

Publié : mar. 21/sept./2010 13:52
par Dumli
Salut,
Bon Dobro, j'ai regardé ton code et le problème c'est qu'il fait 3 tableaux différents. Il faudrait 1Seul tableau composé de X Lignes mais de 4 colonnes.
Aprés j'ai essayé de remanier ton code pour mon programme et il m'envoie le Message "Array index out of bounds" :

Code : Tout sélectionner

#File = 0
#Sep = "|"

If ReadFile (0, "Liste-rem.txt" )
  While Eof (0) = 0 
    a$=a$+ ReadString (#File) 
  Wend 
EndIf 
    
compt= CountString (a$, #Sep)+1
            
For i=1 To compt 
  StringField (a$,i, #Sep)         
Next i
        
Dim colone1.s(compt/4) 
Dim colone2.s(compt/4)
Dim colone3.s(compt/4)
Dim colone4.s(compt/4)

For i=1 To compt Step 4
  Debug i
  colone1(i-1) = StringField (a$,i,#Sep) 
  colone2(i-1) = StringField (a$,i+1,#Sep) 
  colone3(i-1) = StringField (a$,i+2,#Sep)
  colone4(i-1) = StringField (a$,i+3,#Sep) 
Next i
Et j'ai un peu de mal à comprendre comment StringField() fonctionne, même en regardant l'aide de PB ...

A mon avis (qui je pense est completement faux), le mieux serait d'utiliser FindString() puisqu'il renvoi une position, ainsi avec la commande Loc on place la "tête de lecture" à l'endroit ou il a détecté l'élément Séparateur (; ou |) et on lit le mot en le placant dans tels colonne ou tels colonne du tableau.
Voila. :D

Re: Document Texte et PureBasic

Publié : mar. 21/sept./2010 15:09
par Backup
...........................