Echange de valeur entre deux fichiers texte...

zargali Messages postés 17 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 23 mars 2006 - 6 déc. 2005 à 12:33
zargali Messages postés 17 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 23 mars 2006 - 8 déc. 2005 à 10:56
Bonjour a tous!
Tout d'abord je tiens à préciser que je connais un peu le langage VBS mais je sais pas si ca va m'aider vraiment..
Alors voici mon probleme:
Je souhaiterais faire une petite application ou un petit bout de programme je sais pas trop qui ferait ce qui suit:

J'ai deux fichiers textes, et je voudrais échanger des données entre ces deux fichiers... càd que certaines données aillent d'un fichier à un autre (et vice-versa mais deja vice ce serait bien :-D
Quel langage dois-je utiliser? Sachant qu'il faudrait en gros que le logiciel marche de cette maniere:
dans le fichier A, je vais à la ligne où c'est écrit "blabla:" je selectionne la valeur après les ":", je copie ma selection, je vais dans le fichier B, à la ligne où c'est écrit "z-fez:" et je colle ma selection à la place de la valeur... ensuite on retourne dans le fichier A, à la ligne où c'est écrit "blabla2:" et on va coller la valeur dans le fichier B apres "y-erze" etc etc....
J'espère avoir été assez clair et j'espere aussi que vous saurez m'aider!

Merci d'avance!!

11 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 déc. 2005 à 14:24
salut,









en VB6, voici la manière la plus simple (à mon goût), mais elle oblige un léger remaniement de tes fichiers de cette manière :





[Section]

blabla= machin

blabla2=74






' -----

' Form1

' -----

'

Option Explicit

'

Dim sFile1 As String

Dim sFile2 As String

'

'

Private Sub Form_Load()

sFile1 = App.Path & "\Fichier A.txt"

sFile1 = App.Path & "\Fichier B.txt"

End Sub

'

'

Private Sub Command1_Click()

Dim sRet As String



sRet = LireIni(sFile1, "SECTION", "blabla")

Call EcrireIni(sFile2, "SECTION", "z-fez", sRet)



sRet = LireIni(sFile1, "SECTION", "blabla2")

Call EcrireIni(sFile2, "SECTION", "y-erze", sRet)



'etc....



MsgBox "Traitement terminé", 32

End Sub











' -------

' Mod_Ini

' -------

'

Option Explicit

'

'-> lire ini

Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _

(ByVal lpApplicationName As String, ByVal lpKeyName As Any, _

ByVal lpDefault As String, ByVal lpReturnedString As String, _

ByVal nSize As Long, ByVal lpFileName As String) As Long

'

'-> écrire ini

Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _

(ByVal lpApplicationName As String, ByVal lpKeyName As Any, _

ByVal lpString As Any, ByVal lpFileName As String) As Long

'

'

'lire une valeur fichier

Public Function LireIni(Fichier As String, Section As String, Libelle As String) As String

Dim Retour As String: Retour = String (255, Chr$(0))

LireIni = Left$(Retour, GetPrivateProfileString(Section, ByVal Libelle, "", Retour, Len(Retour), Fichier))

End Function

'

'

'écrire une valeur fichier

Public Function EcrireIni(Fichier As String, Section As String, Libelle As String, Valeur As String) As String

EcrireIni = WritePrivateProfileString(Section, Libelle, Valeur, Fichier)

End Function





<small> Coloration
syntaxique automatique [AFCK]</small>



++

PCPT [AFCK]
0
zargali Messages postés 17 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 23 mars 2006
6 déc. 2005 à 16:34
Oh bah merci beaucoup pour ton aide!!

En fait petite rectification (j'avoue que je m'attendais pas à une réponse aussi efficace :-D)
Bon en fait je pense que la chose la plus simple serait de donner un exemple plus concret:
le fichierA comporte ca:
1.0 : +220.00, +155.00
2.0 : +222.24, +157.69
etc... (sachant que ca fait pas forcement 1 2 3 4.. ca peut sauter des numéros!!)

le fichierB comporte ca: (le dubordel veut dire qu'il y a des trucs d'écrit entre)
RGBclassA
factor="0s" dubordel value="15.4545"
factor="1s" dubordel value="54.44"
etc...

RGBclassB
factor="0s" dubordel value="12.101"
factor="1s" dubordel value="156.121"
etc...

et c'est tout

Et la ca devient compliqué et chiant:
il faut que le 1 du 1.0 aille a la place du 0 du 0s
il faut que le 220.00 aille a la place du 15.4545 (sans le +!!)
et que le 155.00 aille à la place du 12.101!!!

tu vois le bordel? ca distribue dans tous les sens..

le 2 du 2.0 va a la place du 1 de 1s, le 222.24 va a la place du 54.44 tandis que le 157.69 va la place du 156.121!!

Voili voila, j'ai été on ne peut plus concret :-D

Merci d'avance!!
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 déc. 2005 à 16:52
re,


je colle ton post pour qu'il soit plus facilement lisible (et te conseille d'ailleurs de changer de browser!!!!)








<hr size="2" width="100%">Oh bah merci beaucoup pour ton aide!!En fait petite rectification

(j'avoue que je m'attendais pas à une réponse aussi efficace :-D)





Bon en fait je pense que la chose la plus simple serait de donner un exemple plus concret:







le fichierA comporte ca:



1.0 : +220.00, +155.00

2.0 : +222.24, +157.69



etc... (sachant que ca fait pas forcement 1 2 3 4.. ca peut sauter des numéros!!)









le fichierB comporte ca: (le dubordel veut dire qu'il y a des trucs d'écrit entre)



RGBclassAfactor="0s" dubordel value="15.4545" factor="1s" dubordel value="54.44"etc...

RGBclassBfactor="0s" dubordel value="12.101" factor="1s" dubordel value="156.121"etc...



et c'est tout

Et la ca devient compliqué et chiant:

il faut que le 1 du 1.0 aille a la place du 0 du 0s

il faut que le 220.00 aille a la place du 15.4545 (sans le +!!)

et que le 155.00 aille à la place du 12.101!!!





tu vois le bordel? ca distribue dans tous les sens..

le 2 du 2.0 va a la place du 1 de 1s,

le 222.24 va a la place du 54.44 tandis que le 157.69 va la place du 156.121!!

Voili voila, j'ai été on ne peut plus concret :-D

Merci d'avance!!


<hr size="2" width="100%">


bon. le truc c'est que s'il n'y a pas de logique, c'est infaisable.





1. selon ton architecture, ma solution d'au dessus semble ne pas convenir.


2. chercher des lignes ou tronçons et les mettre à des endroits...
non-conventionnels (même si j'ai du mal à comprendre comment tu peux
avoir un intérêt ou une obligation à avoir un fichier aussi
bordélique), c'est faisable tout de même.


3. le problème est qu'un moment donné, les numéros pouvant de pas se
suivre, tu vas te retrouver avec une données à mettre à partir d'une
valeur non-existante. donc là, c'est non-résolvable!





mon conseil : revoit la conception de tes fichiers. si pour des raisons
diverses, tu dois absolument les garder tels quels, vois si tu peux
(permission de conception) passer par 2 autres fichiers temporaires qui
eux auraient des restrictions "logiques".





++


PCPT [AFCK]
0
zargali Messages postés 17 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 23 mars 2006
6 déc. 2005 à 17:30
Firefox power ;-) désolé pour la mise en page de tout à l'heure..

Ben en fait quand on regarde bien il y a une logique
En fait:
FichierA
1.0 : +220.00, +155.00
2.0 : +222.24, +157.69

FichierB
RGBclassA
factor="0s" dubordel value="15.4545"
factor="1s" dubordel value="54.44"
etc...

RGBclassB
factor="0s" dubordel value="12.101"
factor="1s" dubordel value="156.121"
etc...

Premiere ligne (1.0), en fait la premiere valeur (220.00) se retrouve en value dans RGBclassA et la seconde (155.00) dans RGBclassB...

Seconde ligne, la premiere valeur (222.24) va dans la value de RGBclassA et la seconde (157.69) dans la value de RGBclassB..

Ensuite le factor est déterminé par la premiere ligne (le 1 du 1.0 va dans le premier factor de RGBclassA et de RGBclassB)

Bon enfin ca me semble pas infaisable non plus pourtant bon elle est bizarre la logique mais elle y est!!

Sinon je peux pas modifier la conception de mes fichiers tels quels mais je peux très bien passer par des fichiers temporaires s'il le faut

Merci beaucoup de ta patience
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 déc. 2005 à 17:55
firefox aussi^^





quand je dis "pas de logique", c'est parce qu'avec une routine, tu peux te retrouver avec (symboliquement)


RGBclassC.factor = CorrespondantFichierA.LibelleB_Introuvable.


sans parler de "plusieurs intitulé du même nom"





donc faisable peut-être par parsing.


avant de continuer... tu peut utiliser VB6 ou pas?! parce qu'en VBS, je ne pourrai pas t'aider.





si ok, donne aussi quelques exemples de dubordel stp
0
zargali Messages postés 17 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 23 mars 2006
7 déc. 2005 à 10:20
D'accord je vois..
je peux utiliser VB6 mais je l'aurais pas avant ce soir!!
pour ce qui est dubordel, en fait c'est un peu plus compliqué que ca..
en fait c'est un enorme fichier ou il y a beaucoup dubordel lol
mais il n'y a pas d'autres factor ou value hors ceux que je t'ai signalé
Petite précision qui a peut-etre son importance, le FichierB peut etre un xml du type

-
-<RGBclassA>
factor= "0s" dubordel value="15.4545"
factor="1s" dubordel value="54.44"
etc...
< /RGBclassA>
-<RGBclassB>
factor ="0s" dubordel value="12.101"
factor="1s" dubordel value="156.121"
etc...
</RGBclassB>


en esperant que ca t'aide, moi en tout cas tu m'aides beaucoup, merci beaucoup!! :-D
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 déc. 2005 à 12:27
pour le XML, je te laisse te débrouiller, c'est un domaine que je n'ai pas encore explorer.

cette source peut peut-être t'aider.



pour le 1er fichier, c'est tout de même un txt classique?

commençant toujours par un "chiffre.zero : " et finissant par un retour chariot?"

"chiffre" à une limite maximale? peut-il y avoir d'autres ":" dans une ligne? ou plus de 2 valeurs?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 déc. 2005 à 13:57
voici comment récupérer et trier ton premier fichier en VB6












Option Explicit

'

'

Private Sub Command1_Click()

Dim aMonFichierTrie() As String



'pour remplacer le "." par "," la ligne ci dessous s'écrit :

'If Not GetFileA("C:\truc.txt", aMonFichierTrie(), True) Then



If Not GetFileA("C:\truc.txt", aMonFichierTrie()) Then

MsgBox "problème dans le parsing! BYE!!", 32

Exit Sub

End If



Dim i As Long

For i = 0 To UBound (aMonFichierTrie)

MsgBox "Ligne " & i + 1 & " : " & vbCrLf & vbCrLf & _

aMonFichierTrie(i, 0) & vbCrLf & _

aMonFichierTrie(i, 1) & vbCrLf & _

aMonFichierTrie(i, 2), _

32

Next i



End Sub

'

'

Public Function GetFileA(ByVal sPath As String, ByRef aResult() As String, Optional ByVal bPointVirg As Boolean = False) As Boolean



GetFileA = False



' existance fichier

If Dir (sPath) = "" Then Exit Function



Dim FF As Long, sFile As String, aLines() As String

Dim i As Integer, lCptNull As Long



' lecture tout

FF = FreeFile

Open sPath For Input As #FF

sFile = Input (LOF(FF), 1)

Close #FF



' par lignes

aLines = Split(sFile, vbCrLf)



' vire les espaces inutiles et compte les lignes vides

lCptNull = 0

For i = 0 To UBound (aLines)

aLines(i) = Trim$(aLines(i))

If LenB(aLines(i)) 0 Then lCptNull lCptNull + 1

Next i



' formate le tableau de sortie

Erase aResult()

ReDim aResult( UBound (aLines) - lCptNull), 2)





Dim j As Long, lPos1 As Long, lPos2 As Long

j = 0



' récupère les données valides et remplace en option le "." par ","

On Error GoTo ErrHandler

For i = 0 To UBound (aLines)

If LenB(aLines(i)) > 0 Then

' 1)

lPos1 = InStr(1, aLines(i), " ")

aResult(j, 0) = Left$(aLines(i), lPos1 - 1) '-1 pour [espace]

If bPointVirg Then aResult(j, 0) = Replace (aResult(j, 0), ".", ",")



' 2)

lPos2 = InStr(lPos1, aLines(i), ",")

aResult(j, 1) = Mid$(aLines(i), lPos1 + 4, lPos2 - lPos1 - 4) 'on a viré le [+]

If bPointVirg Then aResult(j, 1) = Replace (aResult(j, 1), ".", ",")



' 3)

aResult(j, 2) = Mid$(aLines(i), lPos2 + 3) 'on a viré le [+]

If bPointVirg Then aResult(j, 1) = Replace (aResult(j, 2), ".", ",")



j = j + 1

End If

Next i

On Error GoTo 0 '*FGE*



GetFileA = True

Exit Function



ErrHandler:

Debug.Print Err.Number & " : " & Err.Description

Err.Clear

Erase aLines: Erase aResult

End Function




<small> Coloration
syntaxique automatique [AFCK]</small>



PCPT [AFCK]
0
zargali Messages postés 17 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 23 mars 2006
7 déc. 2005 à 16:29
oula merci beaucoup je testerais ca des que jpeux acceder à mon ordi qui a visual basic...

Pour repondre à tes questions au dessus:
le premier fichier est un .txt classique exactement comme je te l'ai écrit au dessus
c'est toujour sous la forme chiffre.zero et chiffre n'a pas de limite.. enfin il a une fin (par exemple 300) mais ca peut monter jusque 3000 quoi...
Dans une ligne il ne peut pas y avoir plus d'un ":" ni plus de deux valeurs.. maintenant les valeurs qui sont reportés doivent être reportées sans le "+" avant, sinon le fichier plante

Merci encore et je te tiens au courant!

C'est vraiment sympa!
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 déc. 2005 à 16:57
une pitite erreur dans le 3) ^^


If bPointVirg Then aResult(j, 2) = ...



normalement t'as toutes les cartes en main ;)
0
zargali Messages postés 17 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 23 mars 2006
8 déc. 2005 à 10:56
Ok et bien merci beaucoup pour toute ton aide, je vais tester tout ca, c'est génial!!
Merci encore!
0
Rejoignez-nous