Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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.

Hasco

XLDnaute Barbatruc
Repose en paix
@Did95

Dans le fichier joint une requête de regroupement par jour et beneficiary.
Il vous faut également changer le chemin du fichier à l'étape source de la requête.

Cordialement

@Staple1600 Merci, j'en ai fait aussi
 

Pièces jointes

  • PQ test import 2.xlsx
    26.6 KB · Affichages: 0

Did95

XLDnaute Nouveau
alors, je ne sais pas quel model est installé,
je n'ai accès qu'a la page web pour administrer mes occupants et exporter les log.

Pour la question des accents cela ne gêne en rien l'export.

la façon A fonctionne bien ainsi que le power query de @Hasco.

Une fois l'export fait il me reste a faire un tableau de passage par jour, mais à part supprimer les doublons des utilisateurs je n'arrive pas à ne les compter qu'une fois par jour.
 

job75

XLDnaute Barbatruc
Bonjour Did95, JM, Hasco, patricktoulon,
ce que je veux eviter c'est que si la personne passe trois dans la journée je ne veux la compter qu'une seule fois.
Placez les 2 fichiers zippés joints dans le même dossier.

Je traite le fichier CSV du post #10 avec 2 dates et 2 prénoms-noms, la macro du fichier Calcul.xlsm :
VB:
Private Sub CommandButton1_Click()
Dim fichier$, d As Object, x%, y$, s, dat As Variant, z$, i&, n&, a(), b()
fichier = ThisWorkbook.Path & "\test export.csv"
Set d = 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)
        z = Chr(1) & s(3) & Chr(1) 'nom encadré
        If d.exists(dat) Then
            i = d(dat) 'récupère la ligne
            If InStr(a(3, i), z) = 0 Then
                a(2, i) = a(2, i) + 1 'comptage
                a(3, i) = a(3, i) & z
            End If
        Else
            n = n + 1
            d(dat) = n 'mémorise la ligne
            ReDim Preserve a(1 To 3, 1 To n)
            a(1, n) = dat
            a(2, n) = 1
            a(3, n) = z
        End If
    End If
Wend
Close #x
'---transposition---
If n Then
    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
A+
 

Pièces jointes

  • Dossier.zip
    20.1 KB · Affichages: 6

Did95

XLDnaute Nouveau
Re

Et quels sont les possibilités d'export ?
Uniquement du CSV ?

Tu pourrais joindre une copie d'écran anonymisée de ta page web ?
Merci.
Oui uniquement du csv et aucun choix possible


mais l'export fonctionne avec la version A, maintenant je vais créer un bouton et voir comment ajouter les log chaque semaine.
Par contre si tu une ideé pour traiter les doublons directement dans un tableau ou de pouvoir dire si le beneficiary 1 passe trois aujourd'hui je ne le compte qu'une fois.

Mais déjà un grand merci pour lextraction direct.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Une fois l'export fait il me reste a faire un tableau de passage par jour, mais à part supprimer les doublons des utilisateurs je n'arrive pas à ne les compter qu'une fois par jour.
Faites ce tableau de passage par requête power query !
Donnez nous un csv avec une 20 lignes et un exemple du résultat souhaité et puis je vous ferez une requête .
 

dysorthographie

XLDnaute Accro
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
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
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é
 
Dernière édition:

job75

XLDnaute Barbatruc
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+
 

Pièces jointes

  • Dossier(1).zip
    22.9 KB · Affichages: 7
Dernière édition:

Discussions similaires

Réponses
10
Affichages
320
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…