Comment fusionner 2 fichiers CSV

Résolu
moscato40
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010
- 23 févr. 2009 à 23:42
moscato40
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
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

4 réponses

Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
24 févr. 2009 à 09:46
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
3
moscato40
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

24 févr. 2009 à 15:46
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)
0
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
24 févr. 2009 à 15:54
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.
0
moscato40
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

24 févr. 2009 à 16:18
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 !
0