Macro concaténation de fichier

Fermé
M6sou Messages postés 70 Date d'inscription lundi 26 mai 2014 Statut Membre Dernière intervention 13 juin 2014 - 26 mai 2014 à 13:55
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 - 12 juin 2014 à 17:00
Salut à tous et à toutes,
Voilà, actuellement je travail sur projet de base de données. Néanmoins, avant de l'attaquer, je devais trier et concaténer des fichiers logs. Sur les conseils d'une personnes, après avoir réaliser ma macro de tir des fichiers, je les ai enregistré en .csv. J'ai donc désormais des fichiers de cette forme là Tss_dataJJMMAAHHMM.log.csv :
Tss_data0102130800.log.csv
Tss_data0102130856.log.csv
Tss_data0506131625.log.csv

J'en ai environ 3000 sur 3 ans, et il peut y avoir plusieurs fichiers par jours. D'où mon problème. Je dois maintenant trouver une solution afin de concaténer ces fichiers .csv .
J'aimerais donc une macro me permettant de dire :
-Prend les fichiers ayant les 14 premiers caractères (Tss_dataJJMMAA) identiques;
-Concaténe les;
-Enregistre le au même nom;
-Et réitère l'opération jusqu'au dernier fichier.

Je ne viens pas les mains vident of course, j'ai déjà réussis la concaténation de tout les fichiers d'un dosiers ainsi que son enregistrement. Il ne manque que la partie "par nom de fichier" que je galère pas mal .

Option Explicit

Sub importDonnees()
Dim principal As ThisWorkbook
Dim repertoire As String, Fichier$
Application.ScreenUpdating = False
Set principal = ThisWorkbook
repertoire = "C:\Documents and Settings\9403095F\Bureau\Test_Macro\"
Fichier = Dir(repertoire & "*.csv")

If "Date1" Like "Date2" Then

Do While Fichier <> ""
Workbooks.Open (repertoire & Fichier)
ActiveSheet.UsedRange.Copy Destination:=principal.Sheets(1).Range("a" & Rows.Count).End(xlUp).Offset(1)
ActiveWorkbook.Close
Fichier = Dir
Loop

ChDir "C:\Documents and Settings\9403095F\Bureau\Test_Macro\Nouveau\"
ActiveWorkbook.SaveAs Filename:= _
"C:\Documents and Settings\9403095F\Bureau\Test_Macro\Nouveau\Finale.xls" _
, FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=True
End If

End Sub
Merci d'avance pour vos réponse,
Bonne journée !!
A voir également:

4 réponses

M6sou Messages postés 70 Date d'inscription lundi 26 mai 2014 Statut Membre Dernière intervention 13 juin 2014
Modifié par M6sou le 27/05/2014 à 09:47
Le code précédent est incomplet.
Petite mise à jour. Après avoir fait pas mal de recherches, j'ai opté pour une solution.
Mon idée est la suivante:
Etant donnée que tout les noms de fichiers ont la même structure, et que ce qui m'intéresse est la date, j'ai décidé de prendre le milieu du nom de fichier et de les comparer entre eux.
Pour ce faire, j'ai écris le code suivant :

Option Explicit

Sub importDonnees()
Dim principal As ThisWorkbook
Dim repertoire As String
Dim NomFichierActif As String
Dim DateActiveP As String
Dim DateActive As String
Dim Init As Boolean

Application.ScreenUpdating = False
Set principal = ThisWorkbook
repertoire = "C:\Documents and Settings\...\Bureau\Test_Macro\"
NomFichierActif = Dir(repertoire & "*.csv")
Init = True
Do While NomFichierActif <> ""
DateActive = Mid(NomFichierActif, 9, 6) ' Prendre la date 1 sur le nom d'un fichier
If DateActiveP = DateActive Then ' Comparer date 1 et date 2
Workbooks.Open (repertoire & NomFichierActif) ' copie
ActiveSheet.UsedRange.Copy Destination:=principal.Sheets(1).Range("a" & Rows.Count).End(xlUp).Offset(1) ' copie ActiveWorkbook.Close True
NomFichierActif = Dir
DateActiveP = DateActive ' mettre la date 1 dans la date 2 Init = False
ChDir "C:\Documents and Settings\9403095F\Bureau\Test_Macro\Nouveau\"

End If
Loop
End Sub

Néanmoins, le programme ne fonctionne pas (sinon je ne serais pas là je pense :D). Il semblerait qu'il bloque au lignes suivante (en gras dans le programme) :
Workbooks.Open (repertoire & NomFichierActif) ' copie ActiveSheet.UsedRange.Copy Destination:=principal.Sheets(1).Range("a" & Rows.Count).End(xlUp).Offset(1) ' copie

Merci pour vos réponses et aide,
Bonne journée !
0
M6sou Messages postés 70 Date d'inscription lundi 26 mai 2014 Statut Membre Dernière intervention 13 juin 2014
5 juin 2014 à 12:52
Personne ?
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
Modifié par f894009 le 6/06/2014 à 14:10
Bonjour,


repertoire = "C:\Documents and Settings\...\Bureau\Test_Macro\"

le chemin doit etre complet
0
M6sou Messages postés 70 Date d'inscription lundi 26 mai 2014 Statut Membre Dernière intervention 13 juin 2014
6 juin 2014 à 18:31
Dans mon programme le chemin est complet là j'ai juste mis des "..." par fainéantise de tout mettre :)
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
Modifié par f894009 le 7/06/2014 à 17:20
Bonjour,

une facon differente de faire:

principe:
deux objets Dictionary , Dico1 pour mise en memoire Date et les noms de fichiers meme date, Dico2 date et nombre de fichiers meme date (je pense qu'il et possible de faire avec un seul avec la valeur de clef)

commande Dos (ici pour deux fichiers):
copy chemin & Fichier1 + chemin & fichier2 chemin & fichierFinal

pensez a mettre votre ou vos repertoires

Option Explicit
'--------------------------- API attente en ms ---------------------------------------------------------
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'-------------------------------------------------------------------------------------------------------------

Sub concat_fichier()
Dim repertoire As String
Dim NomFichierActif As String
Dim FDate As String
Dim TFichier, point As Integer, FFichier, retval
Dim Dico1, Dico2, curKey, sConcat

Application.ScreenUpdating = False
Set Dico1 = CreateObject("Scripting.Dictionary")
Set Dico2 = CreateObject("Scripting.Dictionary")
'repertoire a adapter
repertoire = "D:\_ACSV\"
NomFichierActif = Dir(repertoire & "*.csv")
Do While NomFichierActif <> ""
If Left(NomFichierActif, 4) = "Tss_" Then
'liste fichiers, date
FDate = Mid(NomFichierActif, 9, 6)
'liste Date
If Not Dico2.Exists(FDate) Then
Dico2.Add FDate, 1
Dico1.Add FDate, NomFichierActif
Else
'compteur NbFichier meme date
Dico2.Item(FDate) = Dico2.Item(FDate) + 1
'rang cle en cours
point = Application.Match(FDate, Dico1.keys, 0)
'ajout fichiers meme date
Dico1.Item(FDate) = Dico1.Item(FDate) & "-" & NomFichierActif
End If
End If
NomFichierActif = Dir
Loop
'boucle sur Dico2 pour concatenation fichiers mem date
For Each curKey In Dico2
If Dico2.Item(curKey) > 1 Then 'test si plusieurs fichiers meme date
'mise en tableau des noms de fichier
TFichier = Split(Dico1.Item(curKey), "-")
'nom de fichier final
FFichier = Left(TFichier(0), 14) & ".CSV"
'Chaine de commande DOS pour concatenation fichier
sConcat = "cmd /c Copy " & repertoire
'boucle fichier -1
point = UBound(TFichier)
For point = 0 To point - 1
'ajout fichier
sConcat = sConcat & TFichier(point) & "+" & repertoire
Next
'aout dernier fichier
sConcat = sConcat & TFichier(point)
'ajout nom de fichier final
sConcat = sConcat & " " & repertoire & FFichier
'commande shell
retval = Shell(sConcat, vbMinimizedNoFocus)
'attente: ici 200ms, peut etre remplace par ctrl process shell (a voir)
Sleep 200
End If
Next curKey
Application.ScreenUpdating = True
End Sub

Question: pourquoi passer par une conversion CSV ???????
Les fichiers de log sont des fichiers texte
0
M6sou Messages postés 70 Date d'inscription lundi 26 mai 2014 Statut Membre Dernière intervention 13 juin 2014
10 juin 2014 à 08:40
Salut f894009, merci pour ta réponse et désolez pour le temps qu'aura mise la mienne.
Pour l'histoire de la conversion, elle n'est pas obligatoire pour finir.

Merci pour le programme, j'ai exécuté le programme, en y remplaçant mon répertoire, mais je ne comprends pas une chose :
Où s'enregistre les fichiers finaux ? Car quand je lance le code, je vois bien la fenêtre de cmd s'ouvrir et se fermer rapidement, et travailler mais je ne trouve pas les fichiers de sortie...

Saurez tu où ils se trouvent ?
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
10 juin 2014 à 18:15
Bonjour,

Je n'avais qu'un seul repertoire:
 repertoire = "D:\_ACSV\"

utilise ici:
NomFichierActif = Dir(repertoire & "*.csv")

et

ici:
sConcat = sConcat & " " & repertoire & FFichier

a vous de voir ce que vous avez mis comme repertoires
0
M6sou Messages postés 70 Date d'inscription lundi 26 mai 2014 Statut Membre Dernière intervention 13 juin 2014
11 juin 2014 à 08:49
Oui pour ça je suis d'accord, j'ai mis mon repertoire, le programme tourne bien, mais je ne trouve pas mes fichiers de sorties (fichiers concaténés) ... Ils ne s'enregistrent pas dans le même répertoire
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
11 juin 2014 à 09:00
Bonjour,

Mettez votre code a dispo svp
0
M6sou Messages postés 70 Date d'inscription lundi 26 mai 2014 Statut Membre Dernière intervention 13 juin 2014
11 juin 2014 à 09:08
Option Explicit
'--------------------------- API attente en ms ---------------------------------------------------------
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'-------------------------------------------------------------------------------------------------------------
Sub concat_fichier()
Dim repertoire As String
Dim NomFichierActif As String
Dim FDate As String
Dim TFichier, point As Integer, FFichier, retval
Dim Dico1, Dico2, curKey, sConcat
Application.ScreenUpdating = False
Set Dico1 = CreateObject("Scripting.Dictionary")
Set Dico2 = CreateObject("Scripting.Dictionary")    'repertoire a adapter
NomFichierActif = Dir(repertoire & "*.txt")
repertoire = "C:\Documents and Settings\9403095F\Bureau\Test\"
Do While NomFichierActif <> ""
If Left(NomFichierActif, 4) = "Tss_" Then            'liste fichiers, date
FDate = Mid(NomFichierActif, 9, 6)            'liste Date
If Not Dico2.Exists(FDate) Then
Dico2.Add FDate, 1
Dico1.Add FDate, NomFichierActif
Else                'compteur NbFichier meme date
Dico2.Item(FDate) = Dico2.Item(FDate) + 1                'rang cle en cours
point = Application.Match(FDate, Dico1.keys, 0)                'ajout fichiers meme date
Dico1.Item(FDate) = Dico1.Item(FDate) & "-" & NomFichierActif
End If
End If
NomFichierActif = Dir
Loop    'boucle sur Dico2 pour concatenation fichiers meme date
For Each curKey In Dico2
If Dico2.Item(curKey) > 1 Then      'test si plusieurs fichiers meme date
'mise en tableau des noms de fichier
TFichier = Split(Dico1.Item(curKey), "-")
'nom de fichier final
FFichier = Left(TFichier(0), 14) & "*.txt"            'Chaine de commande DOS pour concatenation fichier
sConcat = "cmd /c Copy " & repertoire            'boucle fichier -1
point = UBound(TFichier)
For point = 0 To point - 1                'ajout fichier
sConcat = sConcat & TFichier(point) & "+" & repertoire
Next            'aout dernier fichier
sConcat = sConcat & TFichier(point)            'ajout nom de fichier final
sConcat = sConcat & " " & repertoire & FFichier            'commande shell
retval = Shell(sConcat, vbMinimizedNoFocus)            'attente: ici 200ms, peut etre remplace par ctrl process shell (a voir)
Sleep 200
End If
Next curKey
Application.ScreenUpdating = True
End Sub
0