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 :

VBS Extraction valeurs d'un fichier CSV


Sujet :

VBScript

  1. #1
    Nouveau Candidat au Club
    VBS Extraction valeurs d'un fichier CSV
    Bonjour,

    Je me permets d'ouvrir une conversation car je me retrouve coincé. Dans le cadre du développement d'une application de supervision, je dois analyser et traiter les informations d'un fichier CSV. Je dois y récuperer une valeur de référence pour du déclenchement d'alarmes entre autre. Il faut que je récupère les informations colonne par colonne de la ligne correspondant à la dernière heure du jour J à disposition dans le fichier.

    Dans une autre conversation j'ai pu trouver un début de réponse qui m'a permis de faire le script suivant mais ce dernier ne fonctionne pas (je n'ai pas de valeurs dans les propriétés que j'essaye d’écrire). Étant débutant, je sollicite votre aide car je n'arrive pas à m'en sortir. Je vous remercie d'avance.

    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
    Option Explicit 
    '******************************************************************************************
    '******************************************************************************************
    						'Script de restitution de valeur d'un fichier CSV
     
    'Le but de ce script à terme sera de permettre l'extraction de la dernière valeur du jour
    'de chacune des colonnes.Cette information remontera sur l'une des propriétés du composant 
    'parent.
     
    '******************************************************************************************
    '******************************************************************************************
     
    'Déclaration des variables
     
    Dim objFSO, objFile, strLine, arrFields, strNewContent
    Dim Mydate, MyTime, MyDateAndTime, MyHour, i
     
    Mydate = DateValue(Date)
    MyTime = TimeValue(Time)
     
    'Création de la Variable d'heure, on extrait les 2 premiers caractère de la chaine.
    Myhour = Left(MyTime, 2)
     
    'Création d'une variable contenant la date et l'heure actuelle
    MyDateAndTime = Mydate & " " & MyHour & ":00"
     
    'Permets la création d'un objet de scriptiing afin de lire un fichier ligne par ligne
     
    Const ForReading = 1
     
    'Crée l'objet de scripting et lui demande d'aller lire le Fichier TEST.csv
     
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("C:\Panorama\Orange Beaublanc_Current\Files\TEST.csv", ForReading)
     
    'Jusqu'a ce que l'objfile soit à la fin on lit le fichier ligne par ligne et on sépare les colonne grace au séparateur ";"
    'si à l'intérieur d'une colonne on trouve "Cool" alors on crée un nouvel élément et on le sauvegarde dans un fichier
     
    Do Until objFile.AtEndOfStream
    	strLine = objFile.ReadLine
     
    	'On découpe la ligne colonne par colonne; Crée un tableau avec les différentes valeurs de la ligne	
     
    	arrFields = Split(strLine, ";")
     
    	'Si dans l'élément arrfields(0) correspondant à la date et l'heure dans le fichier CSV on trouve la valeur "MyDateAndTime" alors on écrit les valeurs dans les propiétés désignées
     
    	If arrFields(0) = MyDateAndTime Then
    		For i = 1 To UBound(arrFields)
     
    			PnSetValue "Parent.DataValue" & i, arrFields(i)
    		Next
    	End If
     
    Loop
     'On ferme l'objet de lecture du fichier CSV
    objFile.Close


    Je vous remercie d'avance pour l'aide que vous m'apporterez.

    Cordialement,

  2. #2
    Rédacteur/Modérateur

    Salut

    Il nous faudrait quelques lignes de ton fichier CSV pour comprendre sa structure.

    Tu peux simplifier la création de ta variable MyDateAndTime.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Mydate = DateValue(Date)
    MyTime = TimeValue(Time)
     
    'Création de la Variable d'heure, on extrait les 2 premiers caractère de la chaine.
    Myhour = Left(MyTime, 2)
     
    'Création d'une variable contenant la date et l'heure actuelle
    MyDateAndTime = Mydate & " " & MyHour & ":00"

    par MyDateAndTime = date & " " & hour(Now) & ":00".

    Es tu sûr que ta variable MyDateAndTime a la même structure que ta variable colonne arrFields(0) ?
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  3. #3
    Nouveau Candidat au Club
    Merci pour la réponse. Voici un exemple de construction de mon CSV. Effectivement j'aurais pu mettre un bout de ce dernier afin de facilité la compréhension de ma demande.

    Code CSV :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    12/07/2019 22:00:00;0,000;0,026;489,137;0,000;0,020;27,000;25,000;26,000;24,500;
    12/07/2019 23:00:00;0,000;0,026;476,457;0,000;0,010;27,000;25,000;26,000;23,083;
    13/07/2019 00:00:00;0,000;0,026;476,291;0,000;0,020;27,000;25,000;26,000;22,167;
    13/07/2019 01:00:00;0,000;0,026;477,458;0,000;0,010;27,000;25,000;26,000;21,500;
    13/07/2019 02:00:00;0,000;0,000;473,788;0,000;0,020;27,000;25,000;26,000;20,500;
    13/07/2019 03:00:00;0,000;0,000;472,621;0,000;0,010;27,000;25,000;26,000;19,750;
    13/07/2019 04:00:00;0,000;0,010;472,620;0,000;0,020;27,000;24,583;26,000;19,250;
    13/07/2019 05:00:00;0,000;0,020;468,950;0,000;0,010;27,000;24,500;26,000;18,583;


    Merci pour l'exemple de simplification, je m'en suis aperçu également et j'ai fait la modif.

    Merci d'avance.

  4. #4
    Rédacteur/Modérateur

    Re

    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
    Option Explicit
    '******************************************************************************************
    '******************************************************************************************
    						'Script de restitution de valeur d'un fichier CSV
     
    'Le but de ce script à terme sera de permettre l'extraction de la dernière valeur du jour
    'de chacune des colonnes.Cette information remontera sur l'une des propriétés du composant
    'parent.
     
    '******************************************************************************************
    '******************************************************************************************
     
    'Déclaration des variables
     
    Dim objFSO, objFile, strLine, arrFields, strNewContent
    Dim Mydate, MyTime, MyDateAndTime, MyHour, i
     
    'Mydate = DateValue(Date)
    'MyTime = TimeValue(Time)
     
    'Création de la Variable d'heure, on extrait les 2 premiers caractère de la chaine.
    'Myhour = Left(MyTime, 2)
     
    'Création d'une variable contenant la date et l'heure actuelle
    'MyDateAndTime = Mydate & " " & MyHour & ":00"
    MyDateAndTime = date & " " & hour(Now) & ":00:00"
    'Permets la création d'un objet de scriptiing afin de lire un fichier ligne par ligne
     
    Const ForReading = 1
     
    'Crée l'objet de scripting et lui demande d'aller lire le Fichier TEST.csv
     
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("C:\MesProgs\En VBScript et HTA\Pour voir\TEST.csv", ForReading)
     
    'Jusqu'a ce que l'objfile soit à la fin on lit le fichier ligne par ligne et on sépare les colonne grace au séparateur ";"
    'si à l'intérieur d'une colonne on trouve "Cool" alors on crée un nouvel élément et on le sauvegarde dans un fichier
     
     
    MyDateAndTime = "13/07/2019 01:00:00"
    Do Until objFile.AtEndOfStream
    	strLine = objFile.ReadLine
    	'On découpe la ligne colonne par colonne; Crée un tableau avec les différentes valeurs de la ligne	
     
    	arrFields = Split(strLine, ";")
     
    	'Si dans l'élément arrfields(0) correspondant à la date et l'heure dans le fichier CSV on trouve la valeur "MyDateAndTime" alors on écrit les valeurs dans les propiétés désignées
     
    	If arrFields(0) = MyDateAndTime Then
                    msgbox arrFields(0)
    		For i = 1 To UBound(arrFields)-1
                            msgbox arrFields(i)
                            'PnSetValue "Parent.DataValue" & i, arrFields(i)
                            Exit For
    		Next
    	End If
     
    Loop
     'On ferme l'objet de lecture du fichier CSV
    objFile.Close

    Ligne 26 j'ai initialisé la variable MyDateAndTime à ma sauce
    Ligne 40 j'ai construit une date/heure que l'on peut trouver dans le fichier TEST.csv et je l'ai attribué à la variable MyDateAndTime.
    Ligne 51 j'ai modifier le max de la variable i pour quelle reste dans le nombre de colonne du champs arrFields.
    Ligne 52, pour le debug, on vérifie si on a la bonne ligne (a effacer/remer plus tard)
    Ligne 53, j'ai remer car cela provoque une erreur, je ne vois pas à quoi correspond PnSetValue "Parent.DataValue", mais il me semble qu'à se stade il faudrait sortir de la boucle For ... Next par un Exit For en ligne 54, il me semble bien qu'il faudrait aussi sortir de la boucle do ... Loop, à toi de voir.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  5. #5
    Nouveau Candidat au Club
    Bonsoir,

    Merci à toi pour ta réponse. Il y a des choses que je ne comprends pas ou alors je me suis peut être mal exprimé. Pour rappel je souhaite, remonter dans les ValueData(i) (car variable suivant suivant le nombre de colonne pour le moment car je ne sais pas de combien de colonne sera composer le CSV définitif) toutes les valeurs de ces colonnes de la dernière ligne présente dans mon csv qui sera actualisé plusieurs fois par jour.

    Je suis parti du principe de fonctionnement par date et heure car c'est ce qui m'a semblé le plus logique. Mon script sera déclenché depuis mon application de supervision toutes les heures pour qu'au moment de l'actualisation du CSV je remonte les dernières valeurs.


    Peux tu m'expliquer pourquoi faire un "-1" pour resté dans les limites du tableau ?
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    For i = 1 To UBound(arrFields)-1


    Ligne 51 j'ai modifier le max de la variable i pour quelle reste dans le nombre de colonne du champs arrFields.
    Car si je fais un -1 a la valeur max du tableau, il me manquera une des dites valeurs ?

    Pour répondre à ton intérogation sur les DataValue, il s'agit de propriété de valeurs ajustable que j'ai créé dans mon application de supervision pour y écrire les dernières valeurs de mon csv afin de pour les traiter en alarmes et en affichage pour des seuils ou autres suivant les demandes de mon client.

    Pour le coup j'ai testé le script en intégrant tes modification. Je n'ai pas de valeurs qui remontent, mais vu l'heure je ne suis pas sur d'avoir les idées bien claires. Je testerai une nouvelle fois en étant dans de bonnes conditions. Cependant, ce qui m'étonne, c'est que j'ai inclu la variable définissant MyDateAndTime à une valeur existante dans le tableau et pourtant je n'ai rien. Il faut vraiment que je trouve un débuggeur qui fonctionne et qui puisse fonctionné rapidement car sans ca je ne vois pas comment m'en sortir.

    Bref, Une nouvelle fois merci, je continue de chercher.

  6. #6
    Rédacteur/Modérateur

    Salut
    Peux tu m'expliquer pourquoi faire un "-1" pour resté dans les limites du tableau ?
    la première colonne a pour index 0, la dérnière a donc pour index MaxColonne-1, preuve tu vérifies la première colonne ici If arrFields(0) ... la colonne date heure qui a pour index zéro.
    Je suis parti du principe de fonctionnement par date et heure car c'est ce qui m'a semblé le plus logique. Mon script sera déclenché depuis mon application de supervision toutes les heures pour qu'au moment de l'actualisation du CSV je remonte les dernières valeurs.
    Il y a peut être un problème ici, pourquoi rechercher par apport à l'heure ?, ton programme de surveillance/récupération ne devrait il pas prendre systématiquement les données de la dernière ligne du CSV?, quitte a vérifier si l'heure de cette ligne correspond à l'heure d'appel du programme de surveillance/récupération.
    Je n'ai pas de valeurs qui remontent, mais vu l'heure je ne suis pas sur d'avoir les idées bien claires
    Pour te proposer le code d'hier, j'ai repris ton fichier test.CSV dans lequel il y a la ligne 1er colonne = 13/07/2019 01:00:00, ce qui fait que le code fonctionne correctement.

    Suivant les nouvelles réponses/informations que tu me donneras, je pourrais sûrement continuer à te donner un coup de main.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  7. #7
    Rédacteur/Modérateur

    Re

    Citation Envoyé par ProgElecT
    la première colonne a pour index 0, la dérnière a donc pour index MaxColonne-1, preuve tu vérifies la première colonne ici If arrFields(0) ... la colonne date heure qui a pour index zéro.

    J'ai dis des bêtises, UBound(arrFields) renvoie bien le dernier index, mais comme le dernier ; termine la ligne, la dernière colonne est vide.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

  8. #8
    Nouveau Candidat au Club
    Bonjour,

    Voici la version finale du script pour mon application de supervision. Merci beaucoup pour l'aid equi m'a été apporté. Sur la fin le problème était coté interprétation des valeurs par le superviseur.

    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
     
    Option Explicit
    '******************************************************************************************
    '******************************************************************************************
    						'Script de restitution de valeur d'un fichier CSV
     
    'Le but de ce script à terme sera de permettre l'extraction de la dernière valeur du jour
    'de chacune des colonnes.Cette information remontera sur l'une des propriétés du composant
    'parent.
     
    '******************************************************************************************
    '******************************************************************************************
     
    'Déclaration des variables
     
    Dim objFSO, objFile, strLine, arrFields
    Dim MyDateAndTime
     
    'Création d'une variable contenant la date et l'heure actuelle
     
    MyDateAndTime = date & " " & hour(Now) & ":00:00"
     
    Const ForReading = 1
     
    'Crée l'objet de scripting et lui demande d'aller lire le Fichier TEST.csv
     
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("C:\Panorama\Orange Beaublanc_Current\Files\TEST.csv", ForReading)
     
    'Jusqu'a ce que l'objfile soit à la fin on lit le fichier ligne par ligne et on sépare les colonne grace au séparateur ";"
    'si à l'intérieur d'une colonne on trouve "Cool" alors on crée un nouvel élément et on le sauvegarde dans un fichier
     
     
    'MyDateAndTime = "13/07/2019 01:00:00"
    Do Until objFile.AtEndOfStream
    	strLine = objFile.ReadLine
    	'On découpe la ligne colonne par colonne; Crée un tableau avec les différentes valeurs de la ligne	
     
    	arrFields = Split(strLine, ";")
     
    	'Si dans l'élément arrfields(0) du CSV on retrouve la valeur "MyDateAndTime" alors on écrit les valeurs dans les propiétés désignées
     
    	If arrFields(0) = MyDateAndTime Then
    		dim i
    		For i = 1 To UBound(arrFields) - 1
     
    		    PnSetValue "#PARENT.DataValue" & i, arrfields(i)
     
    		Next
     
    	End If
     
    Loop
     'On ferme l'objet de lecture du fichier CSV
    objFile.Close

  9. #9
    Rédacteur/Modérateur

    Salut

    Une dernière version a adapter, attribution a une variable tableau de la totalité du fichier, traitement des informations en commençant par la dernière ligne du tableau, l’intérêt étant que si le fichier s'étoffe de plusieurs lignes par jour, dans un certain temps, cela va mouliner, en traavaillant avec une variable tableau est en arrêtant à la première ligne antérieur à la date du jour, gros gain de traitement.
    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
    Option Explicit
    Const ForReading = 1'
    Dim oFso, f, i
    Dim ContenuLgn, ContenuCol
     
    Set oFso = CreateObject("Scripting.FileSystemObject")
     
    'Ouverture et lecture du fichier
    Set f = oFso.OpenTextFile("C:\MesProgs\En VBScript et HTA\Pour voir\TEST.csv", ForReading)
    	'recuperation d'un tableau de x lignes
    	ContenuLgn = split(f.ReadAll,vbnewline)
    	f.close
    	set f = nothing
     
    Dim MyDateAndTime, Existe
    MyDateAndTime = date & " " & hour(Now) & ":00:00"
    MyDateAndTime = "13/07/2019 01:00:00" ' je sais que cette date/heure existe dans le fichier .CSV
    MyDateAndTime = "13/07/2019 01:59:59" ' je sais que cette date/heure n'existe pas dans le fichier .CSV
    Existe = false
     
    'lecture des lignes en commencant par la derniere ligne
    	for f = ubound(ContenuLgn) to 0  Step -1
    		ContenuCol = split(ContenuLgn(f),";")  
    		if ContenuCol(0) = MyDateAndTime then	
    			msgbox ContenuLgn(f)
    			for i = 1 to ubound(ContenuCol)-1
    				msgbox ContenuCol(i)
    				'PnSetValue "Parent.DataValue" & i, arrFields(i)
    			next
    			Existe = true
    			exit for ' si on ne recupere que la ligne du jour en cours pour l'heure en cours
    		end if
    	next
    	if Existe = false then
    		msgbox "Aucune données pour le " & left(MyDateAndTime,13) & "h"
    	end if
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.

###raw>template_hook.ano_emploi###