Document Texte et PureBasic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Dumli
Messages : 75
Inscription : dim. 14/févr./2010 22:28
Localisation : Sud de la France

Document Texte et PureBasic

Message 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:
Windows 7 Ultimate 64-Bit | Intel Core i5 CPU 750 @ 2.67GHz | 4,0 GB RAM | Sapphire Vapor-X ATI Radeon HD 4890 | 2,5 TeraOctet 7200 RPM
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Document Texte et PureBasic

Message 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é.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Document Texte et PureBasic

Message 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.
ImageImage
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Document Texte et PureBasic

Message par Backup »

si tu compte les chr(13) tu aura ton nombre de lignes non ? peut importe le nombre de caracteres donc .. :)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Document Texte et PureBasic

Message 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 
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Scrat
Messages : 86
Inscription : sam. 15/mars/2008 16:00

Re: Document Texte et PureBasic

Message 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+
Avatar de l’utilisateur
Dumli
Messages : 75
Inscription : dim. 14/févr./2010 22:28
Localisation : Sud de la France

Re: Document Texte et PureBasic

Message par Dumli »

Merci pour les réponses rapides et claires ! :D Je vais étudier tout ça :wink:
Windows 7 Ultimate 64-Bit | Intel Core i5 CPU 750 @ 2.67GHz | 4,0 GB RAM | Sapphire Vapor-X ATI Radeon HD 4890 | 2,5 TeraOctet 7200 RPM
Avatar de l’utilisateur
Dumli
Messages : 75
Inscription : dim. 14/févr./2010 22:28
Localisation : Sud de la France

Re: Document Texte et PureBasic

Message 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:
Windows 7 Ultimate 64-Bit | Intel Core i5 CPU 750 @ 2.67GHz | 4,0 GB RAM | Sapphire Vapor-X ATI Radeon HD 4890 | 2,5 TeraOctet 7200 RPM
Avatar de l’utilisateur
Dumli
Messages : 75
Inscription : dim. 14/févr./2010 22:28
Localisation : Sud de la France

Re: Document Texte et PureBasic

Message par Dumli »

:arrow:
Windows 7 Ultimate 64-Bit | Intel Core i5 CPU 750 @ 2.67GHz | 4,0 GB RAM | Sapphire Vapor-X ATI Radeon HD 4890 | 2,5 TeraOctet 7200 RPM
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Document Texte et PureBasic

Message par Backup »

faudrai voir a regarder la fonction stringField() ;)
Avatar de l’utilisateur
Dumli
Messages : 75
Inscription : dim. 14/févr./2010 22:28
Localisation : Sud de la France

Re: Document Texte et PureBasic

Message 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 ...
Windows 7 Ultimate 64-Bit | Intel Core i5 CPU 750 @ 2.67GHz | 4,0 GB RAM | Sapphire Vapor-X ATI Radeon HD 4890 | 2,5 TeraOctet 7200 RPM
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Document Texte et PureBasic

Message par Backup »

......................
Dernière modification par Backup le dim. 20/mars/2011 13:53, modifié 1 fois.
Avatar de l’utilisateur
Dumli
Messages : 75
Inscription : dim. 14/févr./2010 22:28
Localisation : Sud de la France

Re: Document Texte et PureBasic

Message par Dumli »

Merci, je vais voir tous ça
Windows 7 Ultimate 64-Bit | Intel Core i5 CPU 750 @ 2.67GHz | 4,0 GB RAM | Sapphire Vapor-X ATI Radeon HD 4890 | 2,5 TeraOctet 7200 RPM
Avatar de l’utilisateur
Dumli
Messages : 75
Inscription : dim. 14/févr./2010 22:28
Localisation : Sud de la France

Re: Document Texte et PureBasic

Message 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
Windows 7 Ultimate 64-Bit | Intel Core i5 CPU 750 @ 2.67GHz | 4,0 GB RAM | Sapphire Vapor-X ATI Radeon HD 4890 | 2,5 TeraOctet 7200 RPM
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Document Texte et PureBasic

Message par Backup »

...........................
Dernière modification par Backup le dim. 20/mars/2011 13:54, modifié 1 fois.
Répondre