Comment fusionner 2 fichiers CSV [Résolu]

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

4 réponses

Répondre au sujet
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 févr. 2009 à 09:46
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Renfield
moscato40 27 Messages postés mardi 13 mai 2008Date d'inscription 24 juin 2010 Dernière intervention - 24 févr. 2009 à 15:46
0
Utile
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 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 24 févr. 2009 à 15:54
0
Utile
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 27 Messages postés mardi 13 mai 2008Date d'inscription 24 juin 2010 Dernière intervention - 24 févr. 2009 à 16:18
0
Utile
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.