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 :

Création d'une liste aléatoire en parcourant un fichier *.M3U


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Par défaut Création d'une liste aléatoire en parcourant un fichier *.M3U
    Bonjour à tous,

    Suite au sujet BATCH je renouvelle ma demande en VBS cette fois pour le problème suivant:

    Je voulais en parcourant un fichier d'enregistrements de ma bibliothèque musicale appelé Musique.m3u créer une liste aléatoire Alealiste.m3u du contenu de ce fichier, car à l'origine, le contenu du fichier m3u est classé en suivant l'arborescence du dossier Ma Musique. Ma Musique\Artiste\Album\Musique.mp3 ou autres formats.

    Donc j'ai un batch qui génère le fichier Musique.m3u.
    Ici, il faudrait quelque chose de ce genre mais en VBS et non en batch, mais je ne connais rien au VBS . Ce batch est très bien fait, mais pose un problème de lenteur dans le cas d'un fichier Musique.m3u volumineux (Supérieur à 4000 lignes).


    Le code BATCH ci-dessous est de Monsieur Sachadee, que je salut au passage, c'est un code très bien fait affichant deux compteurs pour afficher l'avancement du traitement aléatoire pour l'enrichissement de out.txt que je transforme ensuite en Alealiste.m3u.
    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
     
    @echo off
    setlocal enabledelayedexpansion
    SET "nblines="
    set "$cc=1"
     
    del out.txt 2>nul
     
    FOR /F "delims=" %%I IN (Musique.m3u) DO SET /a nblines+=1
     
     
    for /l %%a in (1=1=%nblines%) do (
    	set /a $random=!random! %%%nblines% +1
    	call:TestRandom %%a)
     
    move out.txt Musique.m3u 2>nul
    exit/b
     
    :TestRandom
    if defined ##!$random! (
       set /a $random=!random! %%%nblines% +1
       goto:TestRandom
    ) else (cls&echo Traitement de [!$cc!/%nblines%]
    		set ##!$random!=1
    		set $c=1
            for /f "delims=" %%b in (Musique.m3u) do (
                if !$random!==!$c! echo %%b>>out.txt
    		    set /a $c+=1
            )
    		set /a $cc+=1
    		)
    Si un génie du code VBS pouvait m'aider, ce serait super.
    Merci par avance de l'aide apporté.

  2. #2
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 130
    Par défaut
    Salut

    Depuis ce post qui permet de créer une série de chiffre aléatoire dans une plage donnée, sans doublon, tu pourrais créer un tableau pour indexer cette suite aléatoire.
    Une fois ta liste lut dans le répertoire, le premier fichier, tu lui donnes pour index TableauFinal(i - MinI), ainsi de suite jusqu’à i = Nbr de fichier du répertoire.
    En modifiant la dernière boucle débutant ligne 45 For i ..... Next i
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre averti
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Par défaut
    Bonsoir ProgElecT ,

    Merci pour cette info !

    Par contre, je suis un boulet en VBS. Donc il faut m'expliquer quelques bricoles dont je ne saisis pas la subtilité:

    1) A quelle endroit je renseigne le fichier source à analyser? Dans mon cas, Musique.m3u.

    2) Quelle est le fichier de sortie?

    3) Une bibliothèque musicale pouvant varier d'un pc à l'autre, comment définir la valeur MAX propre à chacun?

    4) Tu me suggère de remplacer la ligne 45
    For i = MinI To MaxI
    par
    For i ..... Next i
    c'est bien ça?

    Merci des éclaircissements que tu pourras m'apporter.

  4. #4
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 130
    Par défaut
    Salut

    Je suis partie d'un fichier nommé FichierSourceM3u.Txt
    Musique1
    Musique2
    Musique3
    Musique4
    Musique5
    Musique6
    Musique7
    Musique8
    Musique9
    Musique10
    vers un résultat dans un fichier d'une ligne nommé Alealiste.txt
    Musique3,Musique9,Musique4,Musique10,Musique2,Musique8,Musique6,Musique5,Musique7,Musique1
    Il te faut bien sûr adapter ce
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    Dim Msg 'pour vérification
    Dim FichieMusiqueM3u 'Fichier source non aléatoire
    Dim TblFichieMusiqueM3u 'tableau du fichier source non aléatoire
    Dim TableauFinal()'tableau d'index aléatoires
     
    '---------------------------------------Procédures--------------------------------------------
    Sub RecupeFichier(CheminFichierM3u)
    Const ForReading = 1
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject" )
    Set f = fso.OpenTextFile(CheminFichierM3u, ForReading)
    FichieMusiqueM3u = f.readAll
    f.Close
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub SauveFichier(CheminFichierM3u)
    Const ForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject" )
    Set f = fso.OpenTextFile(CheminFichierM3u, ForWriting, True)
    'ecriture en agglomérant les noms de musique aléatoires, séparé par une virgule
    f.Write Join(Alealiste,",")
    f.Close
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub TirageAleatoire(MinI,MaxI)
    Dim i, Ch, Nb, NbAleatoire
    'i pour boucle For ..... Next
    'Ch pour créer une chaine de chiffre aléatoire
    'Nb = Variant pour splitter la chaine contenant les nombres à choisir
    'NbAleatoire = Indice aléatoire pour choisir un élément de la chaine contenant les nombres
     
    ReDim TableauFinal(MaxI - MinI)
    'On va générer une chaine partant du premier au dernier chiffre (donc de MinI à MaxI),
    'les chiffres étant séparés par une virgule
    'Par défaut on aura donc Ch = "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" Etc...
    Ch = MinI
    For i = MinI + 1 To MaxI: Ch = Ch & "," & i: Next
    'On met les chiffres dans un tableau issu du split de la chaine contenant tous les nombres
    Nb = Split(Ch, ",")
    'On tire un nombre x parmi les n éléments
    'Si ce nombre n'est pas le dernier de la liste, le nombre d'indice x devient le nombre d'indice n
    'Par exemple au premier tirage on tire le 7ème nombre parmi les 20, donc 7 pour mon exemple
    'Dans le tableau Nb, on remplace 7 par 24
    'Puis on tire un nombre x parmi les n - 1 éléments (donc parmi les 24 de mon tableau Nb),
    'ça ne peut pas être 7 puisqu'il a été remplacé par le 24ème
    'Si ce nombre n'est pas le n - 1  de la liste, le nombre d'indice x devient le nombre d'indice n - 1
    'Etc...
    Randomize 'Initialise le générateur de nombres aléatoires
    For i = MaxI - MinI To 0 Step -1
      NbAleatoire = Int((i + 1) * Rnd)
      TableauFinal(MaxI - MinI - i) = Nb(NbAleatoire)
      If NbAleatoire < i Then Nb(NbAleatoire) = Nb(i)
    Next
    End Sub
    '--------------------------------------------------------------------------------------------
     
    ' *************************** partie principale *********************************************
    Dim Alealiste(), T
    RecupeFichier "C:\PersoFrancis\En VBScript et HTA\Tirage aleatoire\FichierSourceM3u.txt"
     
    'tableau issu du split du fichier contenant les nom de musiques non triées
    TblFichieMusiqueM3u = Split(FichieMusiqueM3u, vbCrLf) 'séparateur = nouvelle ligne
     
    'création d'un tableau d'indice numérique aléatoire
    TirageAleatoire 0,UBound(TblFichieMusiqueM3u)
     
     
    'tableau pour les noms de musiques aléatoires
    Redim Alealiste (UBound(TblFichieMusiqueM3u))
    'affectation d'un index aléatoire à la liste des musiques
    For T = 0 To UBound(TblFichieMusiqueM3u)
    	Alealiste(TableauFinal(T)) = TblFichieMusiqueM3u(T)
    Next
    'pour vérification
    'For T = 0 To UBound(Alealiste)
    '  Msg = Msg & Alealiste(T)
    '	if T < UBound(Alealiste) Then Msg = Msg & " , "
    'Next
    'msgbox msg
     
    SauveFichier "C:\PersoFrancis\En VBScript et HTA\Tirage aleatoire\Alealiste.txt"
    Si le fichier source FichierSourceM3u est en fait le contenu d'un dossier, il serai possible de lire la liste du dossier sans passer par un fichier, pour un gain de temps d’exécution.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Membre averti
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Par défaut
    Bonjour ProgElecT,

    J'ai testé ton script, c'est beaucoup plus rapide qu'un traitement par BATCH, il n'y a pas photo.

    Peut-on modifier la sortie du fichier Alealiste.txt?
    A la place d'avoir:
    Musique3,Musique9,Musique4,Musique10,Musique2,Musique8,Musique6,Musique5,Musique7,Musique1
    Obtenir:
    Musique3
    Musique9
    Musique4
    Musique10
    etc ...
    Deuxième point, peut-on commencer la première ligne du fichier Alealiste.txt par:
    #EXTM3U
    En tout cas, bravo pour ce script. Merci beaucoup.

  6. #6
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 130
    Par défaut
    Ok

    Dans le code proposé ligne 22 procedure Sub SauveFichier(CheminFichierM3u)remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f.WriteLine "#EXTM3U"
    f.Write Join(Alealiste,"VBCrlf")
    Le presque même code en lisant les fichiers d'un dossier
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    Dim Msg 'pour verification
    Dim FichieMusiqueM3u 'Fichier source non aléatoire
    Dim TblFichieMusiqueM3u() 'tableau du fichier source non aléatoire
    'Dim TblFichieMusiqueM3u 'tableau du fichier source non aléatoire
    Dim TableauFinal()'tableau d'index aléatoires
     
    '---------------------------------------Procedures--------------------------------------------
    Sub RecupeFileList(folderspec)
       Dim fso, f, f1, fc, T
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
    	  If Right(f1.name,3) = "mp3" Or Right(f1.name,3) = "mp2" Then
    		T = T+1
    		Redim Preserve TblFichieMusiqueM3u(T)
    		TblFichieMusiqueM3u(T-1) = f1.name
    	  End If
       Next
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub SauveFichier(CheminFichierM3u)
    Const ForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject" )
    Set f = fso.OpenTextFile(CheminFichierM3u, ForWriting, True)
    'ecriture en agglomerant les noms de musique aléatoires, separé par une virgule
    f.WriteLine "#EXTM3U"
    f.Write Join(Alealiste, vbcrlf)
    f.Close
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub TirageAleatoire(MinI,MaxI)
    Dim i, Ch, Nb, NbAleatoire
    'i pour boucle For ..... Next
    'Ch pour créer une chaine de chiffre aleatoire
    'Nb = Variant pour splitter la chaine contenant les nombres à choisir
    'NbAleatoire = Indice aléatoire pour choisir un élément de la chaine contenant les nombres
     
    ReDim TableauFinal(MaxI - MinI)
    'On va générer une chaine partant du premier au dernier chiffre (donc de MinI à MaxI),
    'les chiffres étant séparés par une virgule
    'Par défaut on aura donc Ch = "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" Etc...
    Ch = MinI
    For i = MinI + 1 To MaxI: Ch = Ch & "," & i: Next
    'On met les chiffres dans un tableau issu du split de la chaine contenant tous les nombres
    Nb = Split(Ch, ",")
    'On tire un nombre x parmi les n éléments
    'Si ce nombre n'est pas le dernier de la liste, le nombre d'indice x devient le nombre d'indice n
    'Par exemple au premier tirage on tire le 7ème nombre parmi les 20, donc 7 pour mon exemple
    'Dans le tableau Nb, on remplace 7 par 24
    'Puis on tire un nombre x parmi les n - 1 éléments (donc parmi les 24 de mon tableau Nb),
    'ça ne peut pas être 7 puisqu'il a été remplacé par le 24ème
    'Si ce nombre n'est pas le n - 1  de la liste, le nombre d'indice x devient le nombre d'indice n - 1
    'Etc...
    Randomize 'Initialise le générateur de nombres aléatoires
    For i = MaxI - MinI To 0 Step -1
      NbAleatoire = Int((i + 1) * Rnd)
      TableauFinal(MaxI - MinI - i) = Nb(NbAleatoire)
      If NbAleatoire < i Then Nb(NbAleatoire) = Nb(i)
    Next
    End Sub
    '--------------------------------------------------------------------------------------------
     
    ' *************************** partie principale *********************************************
    Dim Alealiste(), T
     
    'Liste des fichier du dossier
    RecupeFileList "C:\PersoFrancis\Sources divers\Music MP3 et MP2"
     
    'création d'un tableau d'indice numerique aléatoire
    TirageAleatoire 0,UBound(TblFichieMusiqueM3u)
     
    'tableau pour les noms de musiques aléatoires
    Redim Alealiste (UBound(TblFichieMusiqueM3u))
    'affectation d'un index aléatoire à la liste des musiques
    For T = 0 To UBound(TblFichieMusiqueM3u)
    	Alealiste(TableauFinal(T)) = TblFichieMusiqueM3u(T)
    Next
    'pour verification
    'For T = 0 To UBound(Alealiste)
    '  Msg = Msg & Alealiste(T)
    '	if T < UBound(Alealiste) Then Msg = Msg & " , "
    'Next
    'msgbox msg
     
    SauveFichier "C:\PersoFrancis\En VBScript et HTA\Tirage aleatoire\Alealiste.txt"
    . Attention à la différence de déclaration de la variable TblFichieMusiqueM3u
    Bien penser à adapter les différents chemin de dossier ou fichiers.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Création d'une liste aléatoire en parcourant un fichier *.M3U
    Par LinTianFu dans le forum Scripts/Batch
    Réponses: 12
    Dernier message: 20/10/2016, 14h50
  2. Réponses: 5
    Dernier message: 13/10/2005, 10h19
  3. [generic] pb création d'une List []
    Par yoplaboom dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h01
  4. Création d'une liste ...
    Par keryss dans le forum Access
    Réponses: 6
    Dernier message: 21/10/2004, 09h00

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