Comment fusionner 2 fichiers CSV [Résolu]

moscato40
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Dernière intervention
24 juin 2010
- 23 févr. 2009 à 23:42 - Dernière réponse : moscato40
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Dernière intervention
24 juin 2010
- 24 févr. 2009 à 16:18
Bonjour,

je souhaite faire la somme de deux fichiers CSV de la forme suivante :

fichier1 :
date             code        valeur1    valeur 2
01/01/01     001250    150          200
02/01/01     002050    750          800

fichier2 :

date             code        valeur1    valeur 2

01/01/01     001250    350          500

03/01/01     008000    1                2

et obtenir un fichier3:
date             code        valeur1    valeur 2

01/01/01     001250    500          700

02/01/01     002050    750          800


03/01/01     008000    1                2

J'avais penser utiliser le code de Renfield sur la fusion de deux fichiers INI mais je calle sec.
Quelqu'un pourrait-il m'aiguiller ?

Par avance merci
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 24 févr. 2009 à 09:46
3
Merci
Dim sFileContent As String
Dim xsLines() As String
Dim i As Long
Dim k As Long
Dim xsFields1() As String
Dim xsFields2() As String
Open "C:\a.csv" For Input As #1
sFileContent = Input(LOF(1), 1)
Close #1

Open "C:\b.csv" For Input As #1
sFileContent = sFileContent & vbNewLine & Input(LOF(1), 1)
Close #1

'# A ce stade, on a stocké dans sFileContent la totalité des deux fichiers.
'# Reste a fusionner les lignes donc le code coincide.
xsLines = Split(sFileContent, vbNewLine)

'# On parcoure les lignes une a une
For i = 0 To UBound(xsLines)
If LenB(xsLines(i)) Then
'# On manipulera plus facilement la ligne.
xsFields1 = Split(xsLines(i), vbTab)

'# On parcoure les autres lignes.
For k = i + 1 To UBound(xsLines)
If LenB(xsLines(k)) Then
xsFields2 = Split(xsLines(k), vbTab)
'# Si les codes coïncident, on supprime la ligne 'k'
If xsFields1(1) = xsFields2(1) Then
xsFields1(2) = Val(xsFields1(2)) + Val(xsFields2(2))
xsFields1(3) = Val(xsFields1(3)) + Val(xsFields2(3))

xsLines(k) = vbNullString
End If
End If
Next k

'# On recolle les champs, pour mettre a jour la ligne
xsLines(i) = Join(xsFields1, vbTab)
End If
Next i

sFileContent = Join(xsLines, vbNewLine)

'# La suppression des lignes fusionnée a généré des lignes vierges.
Do While InStr(sFileContent, vbNewLine & vbNewLine)
'# On les supprime donc
sFileContent = Replace(sFileContent, vbNewLine & vbNewLine, vbNewLine)
Loop

Open "c:\c.csv" For Output As #1
Print #1, sFileContent;
Close #1

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Renfield
moscato40
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Dernière intervention
24 juin 2010
- 24 févr. 2009 à 15:46
0
Merci
Salut Renfield,

un très grand merci pour ce code que je suis en train de m'approprier. J'aimerai connaître ta solution pour gérer le séparateur de décimale.
Faut-il modifier les paramètres locaux ? (ce que je trouve un peu bourrin et dangereux),
Faut-il modifier les CSV avant/après traitement ?
As-tu une autre solutionpour l'application en cours ?

En tout cas merci BOCOU !!!
J'espère pouvoir un jour te rendre la pareille (même si j'en doute fort)
Commenter la réponse de moscato40
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 24 févr. 2009 à 15:54
0
Merci
tant que tu as cerné le principe, et que tu sache refaire ^^

---

pas touche a tes paramètres...

juste a enregistrer TOUJOURS en internationnal :

"123456.12" et non "123 456,12"
"2009-02-24" et non "24/02/2009"

après a voir la lecture :
a = "123456.12"
If IsNumeric(a) Then
b = CDbl(a)
Else
b = Val(a)
End If

et CDate fonctionnera par tous les temps... quels-que soient les parametres regionnaux, si tu as bien enregistré...

là, tes dates me semblent douteuses.
Commenter la réponse de Renfield
moscato40
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Dernière intervention
24 juin 2010
- 24 févr. 2009 à 16:18
0
Merci
Je vais reformatter les données pour avoir une base de travail plus "propre" et prendre de bons réflexes.

Encore merci pour tous tes conseils de pros et ton approche pédagogique !
Commenter la réponse de moscato40

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.