[RESOLU]Mise en forme enregistrement fichier texte

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

[RESOLU]Mise en forme enregistrement fichier texte

Message 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
Dernière modification par anissa le mer. 08/juin/2011 20:33, modifié 2 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Mise en forme enregistrement fichier texte

Message 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



anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

Re: Mise en forme enregistrement fichier texte

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

Re: Mise en forme enregistrement fichier texte

Message 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 ... ;)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Mise en forme enregistrement fichier texte

Message par GallyHC »

Cynique dobro, pas possible lolllllllllllllllllllllllllllllll
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

Re: Mise en forme enregistrement fichier texte

Message 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?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Mise en forme enregistrement fichier texte

Message 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.
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

Re: Mise en forme enregistrement fichier texte

Message par anissa »

Ah bon??
Remplace l'extension .rtf par .txt
Je vais le faire.
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

Re: Mise en forme enregistrement fichier texte

Message 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.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: Mise en forme enregistrement fichier texte

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Mise en forme enregistrement fichier texte

Message par nico »

J'allais le dire, doublé par chris.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Mise en forme enregistrement fichier texte

Message 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...
Avatar de l’utilisateur
gildev
Messages : 380
Inscription : mar. 19/juin/2007 10:28
Localisation : Picardie (France)

Re: Mise en forme enregistrement fichier texte

Message par gildev »

Ha mais c'est trop fort ça! Je ne connaissais pas cette commande LSet!
Me coucherai moins con ce soir. :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Mise en forme enregistrement fichier texte

Message 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
Dernière modification par Backup le mar. 07/juin/2011 23:27, modifié 3 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: Mise en forme enregistrement fichier texte

Message 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
Verrouillé