Page 1 sur 2

[RESOLU]Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 18:22
par anissa
Bonjour,

J'ai passé toute la journée à chercher une solution mais rien à faire. J'ai bien peur que Purebasic
n'ait pas prévu ce cas. Ce serait vraiment dommage si c'était vrai. Voici mon problème:

Je voudrais écrire 3 enregistrements dans un fichier texte. L'enregistrement est composé de 3 chaines : Nom, adresse, Télephone. Les données sont disponibles en mémoire telle que:
(dans l'ordre):
Nom(1)="Gildev" : Adr(1)="Paris" : Tel(1)="00000000"
Nom(2)="Dobro" : Adr(2)="Toulouse" : Tel(2)="11111111"
Nom(3)="Anissa" : Adr(3)="Alger" : Tel(3)="22222222"

Ma question est simple: Comment faire pour que mes colonnes soient alignées dans le fichier texte? (chaque nom commence à une même position, idem pour l'adresse et pour le tel)

En Visual basic, on utilise le TAB(): ça permet de positionner automatiquement chaque champ sur une même colonne, comme ceci (et ça marche):

Code : Tout sélectionner

Sub AlignerChamps()
Open "TxtFile" For Output As #1
For i=1 TO 3
     Print #1, Nom(i); Tab; Adr(i); Tab;Tel(i)
Next i
MsgBox ("Terminé")
End Sub
En Pb, Tab automatique n'existe pas et en plus, même dans toutes les syntaxes de fichier texte,
on ne peut pas positionner un champ au niveau de l'enregistrement. Je dis bien positionner un champs (Len(champs) ou space(x) ne règlent pas le problème), Il s'agit au fait de connaître la surface horizontale occupée par un champ en U (U est une unité que j'ignore c'est celle qui permet de connaitre les positions dans un fichier texte), voici pourquoi je ne peux pas utiliser les Mid, Right, Left, Len() etc... :

DOBRO et Dobro sont deux champs qui ont la même taille (Len()=5) mais ils n'occupent pas la même longueur dans un fichier texte, donc ils ne se terminent pas à la même position. Je ne sais pas si c clair mais si vous avez une astuce en pb, je serais ravie.

Merci de votre aide

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 18:52
par Backup
anissa a écrit :J'ai bien peur que Purebasic
n'ait pas prévu ce cas. Ce serait vraiment dommage si c'était vrai. Voici mon problème:
moi j'ai bien peur que ce soit toi le probleme avec ce langage !! :roll:

Ma question est simple: Comment faire pour que mes colonnes soient alignées dans le fichier texte? (chaque nom commence à une même position, idem pour l'adresse et pour le tel)

En Visual basic, on utilise le TAB():
ben en purebasic aussi :roll:

Code : Tout sélectionner

#tab$
ou bien :

Code : Tout sélectionner

#tabulation=chr(9)
ou bien directement chr(9)


donc :

Code : Tout sélectionner

Enumeration
	#file
EndEnumeration

dim nom.s(5)
dim adr.s(5)
dim Tel.s(5)

restore go:
for i=1 to 5
	read.s nom.s(i)
	read.s adr.s(i)
	read.s Tel.s(i)
next i
if filesize("carnet_adresse.rtf")
	DeleteFile("carnet_adresse.rtf")
endif

OpenFile(#file,"carnet_adresse.rtf")
For i=1 TO 5
	WriteStringN(#file, Nom.s(i)+#tab$+Adr.s(i) +#tab$+Tel.s(i))
Next i
CloseFile(#file)

datasection
	go:
	data.s "Mr Toto","1 rue de la liberté","55.55.45.35"
	data.s "Mr Titi","13 rue de la  cathedrale","55.55.23.35"
	data.s "Mr Tutu","23 rue de chant fort","55.23.45.35"
	data.s "Mr Riri","6 rue de la republique","56.55.45.89"
	data.s "Mr fifi","12 rue de la saint glinglin","55.57.45.99"
enddatasection

RunProgram ("carnet_adresse.rtf")

apres , si tu veux réellement de l'alignement, faudra voir a étudier le RTF

Code : Tout sélectionner

Declare .s Tableau_vide_RTF(nbcol,nbligne,largeur,cellfontsize=20) ; 20 = taille par défaut, donc paramètre optionnel
Declare .s   TableauRTF(nbcol,nbligne,largeur)


hwnd = OpenWindow (0,0,0,800,600, "Tableaux" ,#PB_Window_SystemMenu | #PB_Window_ScreenCentered )

EditorGadget(1,10,10,780,580)

SetGadgetText(1,TableauRTF(5,10,2000))

;Ajout d'un tableau vide avec taille des cellules par défaut
AddGadgetItem(1,-1,Tableau_vide_RTF(3,5,1000)) ; avec paramètre par défaut
;Ajout d'un autre tableau vide en changeant la taille des cellules
AddGadgetItem(1,-1,Tableau_vide_RTF(3,3,2000,40)) ; avec paramètre modifié

Repeat
	EventID = WaitWindowEvent ()
	Select EventID
		Case #PB_Event_CloseWindow
		Quit = #True
	EndSelect
Until Quit


Procedure.s Tableau_vide_RTF(nbcol,nbligne,largeur,cellfontsize=20) ; 20 = taille par défaut, donc paramètre optionnel
	result.s = "{\rtf1\trowd"
	Result +"\fs"+Str(cellfontsize)+" " ; Font Size
	For i=1 To nbcol
		result + "\cellx"+Str(i*largeur)
	Next
	For j=1 To nbligne
		result + "\intbl"
		For i=1 To nbcol
			result + "\cell"
		Next
		result + "\row"
	Next
	result + "}"
	ProcedureReturn result
EndProcedure

Procedure.s   TableauRTF(nbcol,nbligne,largeur)
	
	Result.s = "{\rtf1 \trowd"
	
	Result +"\fs32 " ; Font Size 32
	
	For i=1 To nbcol
		Result + "\cellx" + Str (i*largeur) ; defini la largeur de nos cellules
	Next ; la hauteur est definie par la taille de la police de caractère
	
	Result + " \intbl " ; on signale qu'on écrit dans le tableau
	
	For j=1 To nbligne
		If j=1
			Result +Space(3)+"ligne "+Str(j)  ; on ecrit directement sans ajouter de ligne puisqu'elle existe déjà!
			For i=2 To nbcol ; on commence à 2 puisqu'on a commencé à écrire dans la première colonne le mot ligne
				Result + " \cell " ; on va remplir une colonne du tableau
				Result +"\fs20 "   ; on modifie la taille de police
				Result +Space(5)+"Colonne "+Str(i) ; on ecrit dans la cellule avec un espace de 5 char en tête
			Next i
			ElseIf j>1
			Result + "\row " ; on passe à la ligne suivante du tableau
			Result +"\fs32 " ; on revient à la taille de police de départ
			Result +Space(3)+"ligne "+Str(j)  ; on ecrit dans la cellule
			For i=2 To nbcol ; on commence à 2 puisqu'on a commencé à écrire dans la première colonne le mot ligne
				Result + " \cell " ; on va remplir une colonne du tableau
				Result +"\fs20 "  ;on modifie la taille de police
				Result +Space(5)+"Colonne "+Str(i) ; on ecrit dans la cellule
			Next i
		EndIf
	Next j
	result + "\row" ; on referme le tableau
	
	Result + "}"
	
	ProcedureReturn Result
	
EndProcedure

;
; EPb




Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 20:04
par anissa
@Dobro

Merci beaucoup

Je n'ai pas vu la constante #TAB$ pourtant j'ai longuement consulté l'aide, par contre j'ai pensé au CHR(9) et je l'ai même utilisée mais ça n'a rien donné (peut être que ma syntaxe n'était pas correcte?.. possible.. )
moi j'ai bien peur que ce soit toi le problème avec ce langage...
Oui, sans aucun doute...

apres , si tu veux réellement de l'alignement, faudra voir a étudier le RTF
Est ce que ça signifie que le 1er code (#tab$) ne suffit pas?
Je n'ai pas encore testé tes 2 propositions (je le ferais tout à l'heure).

Merci encore Dobro

Tu viens de m'apprendre quelque chose que j'ai jamais utilisée.. (RTF... etc..)

Génial !

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 20:34
par Backup
anissa a écrit :
moi j'ai bien peur que ce soit toi le problème avec ce langage...
Oui, sans aucun doute...
si j'ai été un peu acide c'est en rapport avec ton :
J'ai bien peur que Purebasic
n'ait pas prévu ce cas. Ce serait vraiment dommage si c'était vrai.
avec la logique qui consiste a systématiquement s'en prendre au matériel , au langage, aux autres....
avant de se demander si finalement ça viens pas de nous même ;)

bref , ta réaction est humaine, mais depuis que je lis ce forum
je constate qu'elle proviens les 3/4 du temps de gens qui connaissent mal le langage ..

tu aurai fait ta demande , sans faire cette mise en accusation du langage, je n'aurai
rien ecrit de la sorte .. :)

Fred va encore dire que je suis cynique ... ;)

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 21:04
par GallyHC
Cynique dobro, pas possible lolllllllllllllllllllllllllllllll

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 21:11
par anissa
@Dobro

Eh ... ça n'a pas marché tu sais, ni le 1er ni le 2ème code. Je viens de les essayer.

Désolée Dobro mais... les colonnes ne sont pas positionnées...

Alors?

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 21:28
par djes
Ca fonctionne parfaitement :|
En tous cas ça répond à la demande, peut-être un peu trop d'ailleurs. Remplace l'extension .rtf par .txt , et verras que notepad positionne différemment les tabulations : leur taille dépend de l'éditeur de texte.

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 21:44
par anissa
Ah bon??
Remplace l'extension .rtf par .txt
Je vais le faire.

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 21:50
par anissa
@Djes

ça n'a pas marché, j'ai changé l'extension (txt à place de RTF bien que je me doutais que cela provenait d 'ici) mais ça na rien donné !

Comment se fait il que ça a marché de ton côté? tu peux le code complet qui marche pour voir ?

Peut être que le mien est incomplet (j'ai repris celui de Dobro de A à Z). J'ai rien changé sauf une petite erreur que j'ai d'ailleurs corrigée. Mais j'ai pas les résultats voulus.
En tous cas ça répond à la demande, peut-être un peu trop d'ailleurs
Pour toi peut être mais pour moi ça ne répond pas du tout à ce que je veux.
Exemple: Le n°+ de téléphone ne commence pas à la même position.

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 22:21
par Chris
Tu peux aussi formater tes chaines avec LSet().
Essaye ça.

Code : Tout sélectionner

Dim Amis.s(2, 4)

Amis(0, 0) = "Mr Toto" : Amis(1, 0)="1 rue de la liberté" : Amis(2, 0) = "55.55.45.35"
Amis(0, 1) = "Mr Titi" : Amis(1, 1)="13 rue de la  cathedrale" : Amis(2, 1) = "55.55.23.35"
Amis(0, 2) = "Mr Tutu" : Amis(1, 2)="23 rue de chant fort" : Amis(2, 2) = "55.23.45.35"
Amis(0, 3) = "Mr Riri" : Amis(1, 3)="6 rue de la republique" : Amis(2, 3) = "56.55.45.89"
Amis(0, 4) = "Mr Fifi" : Amis(1, 4)="12 rue de la saint glinglin" : Amis(2, 4) = "55.57.45.99"

If CreateFile(0, "C:\MonFichier.txt")
  For Ligne = 0 To 4
    Ligne$ = LSet(Amis(0, Ligne), 20, " ")+LSet(Amis(1, Ligne), 40, " ")+LSet(Amis(2, Ligne), 20, " ")
    WriteStringN(0, Ligne$)
  Next
  CloseFile(0)
EndIf

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 22:23
par nico
J'allais le dire, doublé par chris.

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 22:44
par djes
Effectivement, j'ai été induit en erreur par le nom de la fonction. Pour moi, une tabulation, c'est le caractère ASCII 9, qui déplace le taquet, et dont on paramètre la largeur dans un éditeur de texte, pas une fonction qui simule ça à coups d'espaces. Je pense qu'il serait difficile d'implémenter ce truc, à moins de ré-écrire une sorte de Print...

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 22:45
par gildev
Ha mais c'est trop fort ça! Je ne connaissais pas cette commande LSet!
Me coucherai moins con ce soir. :lol:

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 23:14
par Backup
mon premier code qui utilise #tab$ fonctionne très bien

d'ailleurs essaye toi même d'entrer cette phrase dans un traitement de texte
"Mr Toto","1 rue de la liberté","55.55.45.35"
en appuyant sur la touche Tab entre chaque champ, tu aura tres exactement
le même résultat que mon code !

les tabulations (Chr(9) ou "#Tab$") fonctionnent exactement comme la touche
Tab d'un traitement de texte !
il ne s'agit pas ici d'espace , mais bien du caractère de Tabulation

apres il faut savoir que dans mon code , chaque tabulation interviens par rapport a la longueur du text qui le précède ... :roll:

donc si tu écris
toto [tab] est un ane
tu n'aura pas le même alignement que
toto le bourrin [tab] est un âne
parce que dans le 2eme cas "toto le bourrin" prends plus de place que "Toto"
du coup la tabulation interviens plus tard ...
si tu veux un vrais alignement , il te faut faire en sorte de préparer les champs de la même taille

par exemple
toto----------------[tab] est un âne
toto le bourrin-----[tab] est un âne
c'est a dire que le premier champ ferai par exemple 20 caractères (avec des espaces si pas de caractère) ; et tout les champs serai préparé de la sorte ,
(et encore faut tenir compte de la chasse...)




c'est pourquoi je t'ai donné le 2eme code
qui lui utilise le formatage RTF , (donc il faut utiliser un éditeur RTF (Wordpad par ex ))
mon code fonctionne très bien au passage sous XP... ;)
Capture du résultat du 2em code :

Image

Re: Mise en forme enregistrement fichier texte

Publié : mar. 07/juin/2011 23:15
par Chris
Petite variante pour aligner les numéros de rue à gauche, comme sur un tableur.

Code : Tout sélectionner

FormatNumero = 3 ; Formatage du numéro de rue. Ici, 3 chiffres

Dim Amis.s(2, 5)

Amis(0, 0) = "Mr Toto"    : Amis(1, 0)="1 rue de la liberté"          : Amis(2, 0) = "55.55.45.35"
Amis(0, 1) = "Mr Titi"    : Amis(1, 1)="13 rue de la  cathedrale"     : Amis(2, 1) = "55.55.23.35"
Amis(0, 2) = "Mr Tutu"    : Amis(1, 2)="23 rue de chant fort"         : Amis(2, 2) = "55.23.45.35"
Amis(0, 3) = "Mr Riri"    : Amis(1, 3)="6 rue de la republique"       : Amis(2, 3) = "56.55.45.89"
Amis(0, 4) = "Mr Fifi"    : Amis(1, 4)="12 rue de la saint glinglin"  : Amis(2, 4) = "55.57.45.99"
Amis(0, 5) = "Mr Loulou"  : Amis(1, 5)="Impasse des Eglantiers"       : Amis(2, 5) = "01-23-45-67-89"

If CreateFile(0, "C:\MonFichier.txt")
  For Ligne = 0 To 5
    Nom$ = Amis(0, Ligne)
    Adresse$ = Amis(1, Ligne)
    Telephone$ = Amis(2, Ligne)
    
    If Left(Adresse$, 1) >= "0" And Left(Adresse$, 1) <= "9"
      Numero$ = StringField(Adresse$, 1, " ") ; On prélève le numéro de rue
      LenNumero = Len(Numero$)                 ; Calcul de la longueur du Numéro
      Rue$ = Right(Adresse$, Len(Adresse$)-LenNumero) ; On récupère la partie "Nom de rue" en gardant l'espace qui suit le numéro
      
      Adresse$ = RSet(Numero$, FormatNumero, " ") + Rue$ ; On aligne le numéro à gauche, et on reconstitue l'adresse
    Else
       Adresse$ = Space(FormatNumero +1) + Adresse$
    EndIf
    
    Ligne$ = LSet(Nom$, 20, " ")+LSet(Adresse$, 40, " ")+LSet(Telephone$, 14, " ")
    WriteStringN(0, Ligne$)
  Next
  CloseFile(0)
EndIf