Microsoft 365 Problème pour traiter un fichier csv

Did95

XLDnaute Nouveau
Bonsoir,
toutes les semaines je dois analyser les entrées journalières de parking.
Je souhaiterai savoir si il y a un moyen d'automatiser la transformation du fichier csv vers excel?

Les log indiquent les jours et heures de personnes qui passent la porte,
j'ai besoin de ressortir les noms et si ils sont passés une fois par jour, actuellement si la personne badge 3 fois cela me compte trois.
Pour remédier a ce problème, je suis obligé de modifier la date en précisant uniquement le jour, puis je passe par supprimer les doublons et enfin un tableau croisé.

si vous penser avoir un solution je pourrai vous fournir un fichier csv de test.

Merci d'avance pour vos réponses
Didier
 
Solution
Re,

Ce fichier est bon

voici une requête Power Query qui reprends vos données. Pour le reste il faut détailler ce que vous voulez exactement. La requête ajoute une colonne 'Jour'

Changez le chemin du fichier dans l'étape source de la requête.

Difficile avec une seule ligne de données de faire une démonstration mais vous pouvez faire vos propre transformation dans power query

Cordialement

@Staple1600 : oui j'ai testé le fichier d'origine avec pleins de page de codes possibles.

Did95

XLDnaute Nouveau
Bonjour Did95, le forum,

La macro de mon post #23 prend beaucoup trop de temps sur un grand tableau : 125 secondes chez moi pour 1 date avec 100 000 noms [Edit| différents.

Prenez cette macro qui utilise 2 Dictionary :
VB:
Private Sub CommandButton1_Click()
Dim fichier$, d As Object, dd As Object, x%, y$, s, dat As Variant, n&, a(), b(), i&, j&
fichier = ThisWorkbook.Path & "\test export.csv"
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
x = FreeFile
Open fichier For Input As #x 'ouverture en lecture séquentielle
While Not EOF(x)
    Line Input #x, y 'récupère la ligne
    y = Replace(y, """,""", ";") 'pour avoir le point-virgule à gauche du nom
    y = Replace(y, """,", ";") 'pour avoir le point-virgule à droite du nom
    s = Split(y, ";")
    dat = Mid(s(0), 2, 10)
    If IsDate(dat) Then
        dat = CDate(dat)
        If Not d.exists(dat) Then
            n = n + 1
            d(dat) = n 'mémorise la ligne
            ReDim Preserve a(1 To 2, 1 To n)
            a(1, n) = dat
        End If
        dd(dat & s(3)) = ""
    End If
Wend
Close #x
If n Then
    '---complète le tableau a---
    b = dd.keys
    For i = 0 To UBound(b)
        j = d(CDate(Left(b(i), 10))) 'récupère la ligne
        a(2, j) = a(2, j) + 1 'comptage
    Next
    '---transposition---
    ReDim b(1 To n, 1 To 2)
    For i = 1 To n
        b(i, 1) = a(1, i)
        b(i, 2) = a(2, i)
    Next
End If
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2] '1ère cellule de destination
    If n Then .Resize(n, 2) = b
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 2).ClearContents 'RAZ en dessous
End With
End Sub
Avec 100 000 noms différents elle s'exécute en 1,6 seconde.

A+
Bonjour , j'ai testé mais cela ne fonctionne pas avec mon fichier csv.
j'ai fait un copier/coller de mon csv dans le tes export et cela ne calcul pas non plus.
j'ai vraiment du mal a rendre anomyne ce fichier.

A+
 

Did95

XLDnaute Nouveau
Bonsoir,
Ce n'est pas de l'UTF8, je n'ai pas trouvé ce que c'est!
VB:
Sub test()
PressePapier = Replace(Replace(OuvrirFichier(ThisWorkbook.Path & "\export test.csv"), Chr(34), ""), ",", vbTab)
ActiveCell.PasteSpecial xlPasteAll
End Sub
'retourne un fichier texte sous forme de tableau
Private Function OuvrirFichier(Fichier)
Set oFs = CreateObject("Scripting.FileSystemObject")
Set oFile = oFs.OpenTextFile(Fichier)
OuvrirFichier = oFile.ReadAll
oFile.Close
End Function
Public Function ClearPressePapier()
With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text"): End With
End Function
Public Property Let PressePapier(valeur)
With CreateObject("htmlfile").parentwindow.clipboardData.setData("Text", valeur): End With
End Property

Public Property Get PressePapier()
PressePapier = CreateObject("htmlfile").parentwindow.clipboardData.GetData("TEXT")
End Property

Merci Patrick pour le presse papier
Bonjour,
Merci beaucoup pour votre réponse , mais la ça se complique vraiment pour moi.
Je ne connais pas le VBA et je ne sais pas ce que je dois faire. Désolé.
 

patricktoulon

XLDnaute Barbatruc
bonjour
clique sur le bouton bleu choisi ton fichier dans le dialog et voilà terminé
te restera plus qu'a faire un remove duplicate pour les doublons
là c'est difficile c'est toujours le même nom prénom
mes camarades t'indiqueront la marche a suivre c'est assez simple
 

Pièces jointes

  • import csv parking.xlsm
    17 KB · Affichages: 4

Did95

XLDnaute Nouveau
bonjour
clique sur le bouton bleu choisi ton fichier dans le dialog et voilà terminé
te restera plus qu'a faire un remove duplicate pour les doublons
là c'est difficile c'est toujours le même nom prénom
mes camarades t'indiqueront la marche a suivre c'est assez simple
Merci,
je testerai chez moi car dans ma société, les macros de ce document pour des raisons de sécurité par l'administrateur.
Cdt
 

Did95

XLDnaute Nouveau
re
Bonsoir Robert
et oui en html j'aurais du y penser c'est vrai que le passage du texte dans le clip de l'object html fait un peu le ménage déjà
j'avais oublié merci robert pour le rappel

c'est vrai que c'est tout de suite plus simple à travailler
VB:
Sub testQ()
    PressePapier = Replace(Replace(OuvrirFichier(ThisWorkbook.Path & "\export test.csv"), Chr(34), ""), ",", vbTab)
    With ActiveSheet
        .UsedRange.Clear
        .Cells(1).PasteSpecial xlPasteAll
        .UsedRange.Cells.Replace "é", "é"
        .UsedRange.EntireColumn.AutoFit
        .Cells(1).Select
    End With
End Sub

ensuite un removeduplicate et terminé

Bonjour,
Il n'y a rien à faire juste donner le nom et le chemin chemin complet du CSV {ThisWorkbook.Path & "\export test.csv"}

C'est pas grave.

Je suis désolé également !
re,
Bonjour ,
Merci l'injection ce fait très bien.
j'ai coller le code dans vba et cela fonctionne bien.

Il faut maintenant enlever les doublons par jour, et ne compter qu'un seul passage par jour pour chaque utilisateur
 

Did95

XLDnaute Nouveau
Re,

Euh ! et le fichier csv source ! Et l'exemple du résultat escompté !
Donnez un peu du vôtre sinon on va pas s'en sortir !
re,
j'ai remis le fichier Excel en ZIP,
mais votre solution en power query ainsi que la solution en vba fonctionne très pour l'import et pour cela je vous remercie.
il faut juste que j'arrive à faire un tri une fois l'export dans Excel afin de ne pouvoir compter un passge par personne par jour.

La seule solution que j'ai trouvé, est de modifie la colonne date en enlevant les heures et après je supprime les doublons. comme ça le tableau croisé correspond aux attente.

Merci beaucoup de votre investissement pour résoudre mon problème.
 

Pièces jointes

  • PQ test import1.zip
    30.7 KB · Affichages: 3

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Ce que j'essaie de vous dire depuis le début, c'est que vous pouvez faire tout ça par power query sans même si vous le voulez afficher le tableau !

Mais pour vous le montrer il nous faut un exemple de résultat attendu.
Je viens d'ouvrir votre dernier .zip et toujours pas de fichier .csv source !

J'abandonne
 

Did95

XLDnaute Nouveau
Re,

Ce que j'essaie de vous dire depuis le début, c'est que vous pouvez faire tout ça par power query sans même si vous le voulez afficher le tableau !

Mais pour vous le montrer il nous faut un exemple de résultat attendu.
Je viens d'ouvrir votre dernier .zip et toujours pas de fichier .csv source !

J'abandonne
Re,
je ne peux pas faire de fichier source csv, trop compliqué a le rendre anonyme.
je vous remercie pour ce que vous avez fait, le reste je le ferai à la main.
 

Discussions similaires

Réponses
10
Affichages
310

Statistiques des forums

Discussions
312 176
Messages
2 085 959
Membres
103 061
dernier inscrit
Zebor