Comment fusionner 2 fichiers CSV [Résolu]

Signaler
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010
-
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010
-
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

4 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
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
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

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)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
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.
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

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 !