IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Additionner des heures notées dans un fichier .txt


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut Additionner des heures notées dans un fichier .txt
    Bonjour,

    J'ai terminé une partie de mon projet grâce à ce forum et j'en suis bien content, merci à Pitchalov qui m'as bien aidé.
    Mon problème maintenant c'est que j'ai un fichier "rapport.txt" qui contient ça:

    Date Durée Photos Username
    16.09.2009 01:07:10 74 Jean
    16.09.2009 01:09:42 12 Jean
    16.09.2009 01:10:33 5 George
    16.09.2009 01:12:01 15 George
    16.09.2009 00:00:41 20 Jean
    16.09.2009 00:01:23 10 Jean
    16.09.2009 00:00:38 2 Raymond
    16.09.2009 00:02:37 43 Raymond
    16.09.2009 01:40:22 6 Jean

    J'aimerai obtenir la somme en minutes et la somme des photos pour chacun des utilisateurs. ex: ça m'écrit dans un autre fichier: raymond: 683min, 332photos, jean: 23min, 15photos; George: 232min, 234photos.
    J'ai écris un début qui permet de lire chaque ligne du fichier rapport.txt.
    Je ne sais pas comment compter les heures des lignes d'un user défini et en faire la somme. J'ai vu qu'il y a une fonction recherche de pattern mais j'arrive pas à l'utiliser, je me dis que mes pattern (les users) sont tous différents, le pattern doit changer aussi. J'espère que c'est faisable, avec le temps ce fichiers rapport.txt contiendra une bonne trentaine d'user différents. Ca m'aiderai bien si quelqu'un pouvait se pencher sur mon problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim filesys, text, readfile, ligne
    set filesys = CreateObject("Scripting.FileSystemObject")
    set readfile = filesys.OpenTextFile("C:\Documents and Settings\All Users\Documents\rapport.txt", 1, false)
    do while readfile.AtEndOfStream=false
    ligne = readfile.ReadLine
    'wscript.echo ligne
    loop
    readfile.close

  2. #2
    Membre chevronné Avatar de pitchalov
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 340
    Par défaut
    Salut.

    Une possibilité serait :
    - Création d'un tableau double (X, 3) qui contiendra pour chaque ligne un tableau de correspondance (user, time, nbPhotos)
    - pour chaque ligne lue, récupération des infos voulues (tu peux utiliser Split, qui te transformera ta chaine en tableau)
    - Vérification dans le tableau double que l'user existe. S'il n'existe pas, création d'une nouvelle ligne avec l'user. S'il existe, incrémentation de time et nbPhoto de l'user en question.

    Tu peux utiliser Excel pour ça, mais ça alourdit grandement le script.
    Sinon tu peux t'en sortir en utilisant des Array de VBS

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut
    Merci Pitchalov, mais je bloque toujours à l'étape récupération de l'heure de la première ligne et l'additionner à la deuxième ligne si l'user est le même.
    J'ai changé le format de rapport.txt pour qu'il indique le nombre de photos au format 0000 pensnat que ça allait me simplifier la vie pour la récupération mais je sais pas comment l'écrire

    Date Durée Photos Username
    16.09.2009 01:07:10 0074 Jean
    16.09.2009 01:09:42 0012 Jean
    16.09.2009 01:10:33 0005 George
    16.09.2009 01:12:01 0015 George
    16.09.2009 00:00:41 0020 Jean
    16.09.2009 00:01:23 0010 Jean
    16.09.2009 00:00:38 0002 Raymond
    16.09.2009 00:02:37 0043 Raymond
    16.09.2009 01:40:22 0006 Jean

    J'ai ça pour l'instant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Dim filesys, readfile, r, heure, t1(3)
    set filesys = CreateObject("Scripting.FileSystemObject")
    set readfile = filesys.OpenTextFile("C:\Documents and Settings\All Users\Documents\rapport.txt", 1, false)
    do while readfile.AtEndOfStream=false
    r = readfile.ReadLine
    vraijour=Mid(r,1,2)
    vraimois=Mid(r,4,2)
    vraian=Mid(r,7,4)
    vraieheure=Mid(r,12,2)
    vraieminute=Mid(r,15,2)
    vraiesec=Mid(r,18,2)
    photos = Mid(r,21,4)
    user = Mid(r,26,20)
    jour = (vraijour & "." & vraimois & "." & vraian)
    heure=(vraieheure & ":" & vraieminute & ":" & vraiesec)
    t1(0)=jour:t1(1)=heure:t1(2)=photos:t1(3)=user
    wscript.echo join(t1)
    loop
    readfile.close
    je ne comprend pas comment garder en mémoire l'heure de la ligne Jean et l'additionner avec la prochaine ligne Jean, garder en mémoire le résultat, et l'additionner avec la prochaine etc... et faire ça pour chaque prénom????

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut
    Voilà, j'en suis arrivé là, ça fonctionne (seulement pour les heures) mais c'est la technique "coup de massue". C'est à dire que pour chaque utilisateur que je trouve dans le fichier rapport.txt je dois ajouter ces lignes, ex: pour le user george

    Else If t1(3) = "george" then
    sumtime4 = sumtime4 + (t1(1))
    user4 = "george"

    et ajouter ça à la fin :

    f.Write (sumtime1 & vbtab & user1 & vbnewline & sumtime2 & vbtab & user2 & vbnewline & sumtime3 & vbtab & user3 & vbnewline & sumtime4 & vbtab & user4 & vbnewline)

    c'est un script vraiment lourd et je ne vois pas comment l'alléger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Dim filesys, readfile, r, heure, t1(3)
    set filesys = CreateObject("Scripting.FileSystemObject")
    set readfile = filesys.OpenTextFile("C:\Documents and Settings\All Users\Documents\rapport.txt", 1, false)
    do while readfile.AtEndOfStream=false
    r = readfile.ReadLine
    'wscript.echo r
    vraijour=Mid(r,1,2)
    vraimois=Mid(r,4,2)
    vraian=Mid(r,7,4)
    heure=Mid(r,12,2)
    minutes=Mid(r,15,2)
    secondes=Mid(r,18,2)
    photos = Mid(r,21,4)
    user = Mid(r,26,20)
    jour = (vraijour & "." & vraimois & "." & vraian)
    heures=(heure & ":" & minutes & ":" & secondes)
    'minutes= (60*(Type(vraieheure))) + (Type(vraieminute))
      'wscript.echo heure
    If IsDate(heures) Then
      d = (CDate(heures))
      End If
      'wscript.echo d
    Tempsmin = (Hour(d)*60) + (Minute(d))
    	'wscript.echo Tempsmin
     
    t1(0)=jour:t1(1)=Tempsmin:t1(2)=photos:t1(3)=user
     'wscript.echo (t1(3))
     
    If t1(3) = "Jean" then
    sumtime1 = sumtime1 + (t1(1))
    user1 = "Jean"
    Else If t1(3) = "newuser" then
    sumtime2 = sumtime2 + (t1(1))
    user2 = "newuser"
    Else If t1(3) = "toto" then
    sumtime3 = sumtime3 + (t1(1))
    user3 = "toto"
    Else If t1(3) = "george" then
    sumtime4 = sumtime4 + (t1(1))
    user4 = "george"
    End If
    End If
    End If
    End If
    'wscript.echo sumtime
     
    loop
    readfile.close
     
    Set Fso = CreateObject("Scripting.FileSystemObject")
      Set f = Fso.OpenTextFile("C:\Documents and Settings\All Users\Documents\totalclients2.txt", 8)
          f.Write (sumtime1 & vbtab & user1 & vbnewline & sumtime2 & vbtab & user2 & vbnewline & sumtime3 & vbtab & user3 & vbnewline & sumtime4 & vbtab & user4 & vbnewline)
    'wscript.echo sumtime & vbtab & user & vbnewline

  5. #5
    Membre chevronné Avatar de pitchalov
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 340
    Par défaut
    Salut.

    Effectivement, ce que tu as fait ça fonctionne, mais pour combien de temps?...
    Ca vaut pas le coup de devoir faire une modif pour chaque nouveau User.

    Je reste sur mon idée de tableau double.

    Voici un exemple, que tu pourras adapter à ton code une fois digéré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objInfoFile = objFso.OpenTextFile(".\info.txt", 1)
    Dim arrUsers ()
    ReDim arrUsers(2, 0)
    Do While Not objInfoFile.AtEndOfStream
    	arrTemp = Split(objInfoFile.ReadLine)
    	i = 0
    	boolUserFind = False
    	If arrTemp(1) = arrUsers(0, i) Then boolUserFind = True
    	Do While boolUserFind = False AND i < Ubound(arrUsers, 2)
    		i = i + 1
    		If arrTemp(1) = arrUsers(0, i) Then boolUserFind = True
    	Loop
    	If boolUserFind = True Then
    		arrUsers(1, i) = CInt(arrUsers(1, i)) + CInt(arrTemp(0))
    	Else
    		Redim Preserve arrUsers (2, Ubound(arrUsers, 2) + 1)
    		arrUsers(0, Ubound(arrUsers, 2) - 1) = arrTemp(1)
    		arrUsers(1, Ubound(arrUsers, 2) - 1) = arrTemp(0)
    	End If	
    Loop
    Redim Preserve arrUsers (2, Ubound(arrUsers, 2) - 1)
    strTemp = ""
    For i = 0 To Ubound(arrUsers, 2)
    	strTemp = strTemp & arrUsers(0, i) & vbTab & arrUsers(1, i) & vbCrLf
    Next
    WScript.Echo strTemp
    Ce code est appliqué au fichier info.txt du même dossier, contenant :
    13 tata
    118 tutu
    15 titi
    45 toto
    14 titi
    13 tata
    28 tutu
    123 toto
    997 titi
    1 tutu
    12 tata
    35 titi
    100 toto
    3 toto
    Et le résultat est :
    tata 38
    tutu 147
    titi 1061
    toto 271
    L'idée, c'est d'incrémenter ton tableau à chaque nouvel utilisateur rencontré dans le fichier, et de renseigner les infos pour les utilisateurs existant déjà.

    C'est un peu lourd et barbant à mettre en place, mais une fois réalisé tu n'y touches plus.

    Bon courage

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut
    Super, merci beaucoup je vais travailler là dessus. Pour l'instant je suis pommé mais c'est un bon exercice, en tous cas ça marche!

Discussions similaires

  1. lire des valeurs vides dans un fichier txt
    Par bakaratoun dans le forum MATLAB
    Réponses: 5
    Dernier message: 14/12/2009, 16h15
  2. Réponses: 6
    Dernier message: 26/05/2008, 20h08
  3. Réponses: 4
    Dernier message: 28/08/2006, 14h47
  4. Remplacer / Supprimer des données dans un fichier txt
    Par PedroBD dans le forum Langage
    Réponses: 3
    Dernier message: 03/07/2006, 13h33
  5. Réponses: 5
    Dernier message: 21/10/2005, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo