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 :

[VBS] transférer le contenu d'un fichier csv dans un tableau à deux dimensions


Sujet :

VBScript

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut [VBS] transférer le contenu d'un fichier csv dans un tableau à deux dimensions
    Bonjour à tous,

    Quelques informations à mon sujet: j'opère une reconversion professionnelle, j'ai fait un peu de pascal quand j'étais à la fac, je me documente sur le net, mais bon... On pourrait gentiment me qualifier de noob en matière de vbs.

    J'ai cherché un peu partout sur le forum et sur le net, et je n'ai rien trouvé...
    J'ai un fichier CSV qui a cette tête là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    title1,title2,title3,title4
    ="contenu1",="contenu2",="contenu3",="contenu4"
    ="contenu5",="contenu6",="contenu7",="contenu8"
    ...
    et je voudrais le faire rentrer dans un tableau à 4 colonnes, mais j'ai un peu de mal. Voilà où j'en suis rendu:
    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
     
    Function csv_to_table(ByVal file_name As String)
       dim num_lines 'le nombre de lignes dans le fichier CSV
           num_lines=CLng(file_name)
       dim result_array(0,4)
       dim line_count
       dim fs,objTextFile
       set fs=CreateObject("Scripting.FileSystemObject")
       set objTextFile = fs.OpenTextFile(file_name)   	
     
       line_count=0
     
       Do while NOT objTextFile.AtEndOfStream
          result_array = Mid(split(objTextFile.ReadLine,","),2,Len(split(objTextFile.ReadLine,",")-1))
       '2 pour enlever les 2 premiers caractères, Len(..)-1 pour enlever le dernier
          line_count=line_count+1
       Loop
    End Function
    Mon problème, est le suivant: est-ce que comme ça, je rajouterai une ligne à mon tableau à chaque itération, ou pas ?

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Pour rappel :
    Mid(string, start[, length])
    Renvoie un nombre spécifié (length) de caractère à partir d'une chaîne de caractères (string).
    Split(expression[, delimiter[, count[, compare]]])
    Retourne un tableau de chaîne unidimensionnel contenant un nombre spécifié de sous-chaînes.
    Et result_array est un tableau de (0,4)

    Donc qu'est ce qui ne va pas dans ceci à ton avis ?
    result_array = Mid(split(objTextFile.ReadLine,","), ...

    Tableau dans son ensemble = fonction qui renvoie une chaine de caractère( fonction qui renvoie un tableau de chaine( chaine de caractère, séparateur ) )

    Normalement, si tu essayes d'utiliser la fonction dans un script, le script ne se lance et l'interpréteur te râle à la figure non ? Ou tu n'as pas essayé ?

    Je ne te donne pas volontairement la réponse car si tu te reconvertis, il vaut mieux que tu comprennses.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    et ce n'est pas une bonne idée que de placer deux ReadLine successifs dans la boucle...
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Et result_array est un tableau de (0,4)
    Donc qu'est ce qui ne va pas dans ceci à ton avis ?
    result_array = Mid(split(objTextFile.ReadLine,","), ...
    Tableau dans son ensemble = fonction qui renvoie une chaine de caractère( fonction qui renvoie un tableau de chaine( chaine de caractère, séparateur ) )
    Ah, oui, forcément... J'ai trituré le fichier pour qu'il soit propre, plus de "Mid" à utiliser (je sais, je contourne le problème, mais j'ai besoin que ça fonctionne rapidement )
    Normalement, si tu essayes d'utiliser la fonction dans un script, le script ne se lance et l'interpréteur te râle à la figure non ? Ou tu n'as pas essayé ?
    Non, l'interpreteur de râle pas... mais il ne se passe rien du tout...
    Je ne te donne pas volontairement la réponse car si tu te reconvertis, il vaut mieux que tu comprennses.
    OK, je comprends la démarche, même si c'est dur
    Bon, après réflexion et bidouille, mon script donne ça:
    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
     
    dim file_name
    file_name="E:\dev\today_file.csv"
    dim result_array()
    dim fs,objTextFile
    set fs=CreateObject("Scripting.FileSystemObject")
    set objTextFile = fs.OpenTextFile(file_name, ForReading)
     
    Do while NOT objTextFile.AtEndOfStream
      result_array = Split(objTextFile.ReadLine,",")
    Loop
    For i=0 to Ubound(result_array,1)
    	For j=0 to Ubound(result_array,2)
    		Wscript.echo result_array(i,j)
    	Next
    Next
    Sauf que, bien entendu, l'interpréteur râle toujours... manifestement, le problème se situe là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set objTextFile = fs.OpenTextFile(file_name, ForReading)
    Donc, je n'utilise pas cette commande correctement, mais je ne vois pas. euh, au secours ?

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    si c'est tout ton script tu n'as ni déclarer ForReading ni donné de valeur à ForReading, donc tu passes une variable avec aucune valeur à la fonction.

    http://vb.developpez.com/faqvbs/?pag...#fsoLitFichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Do while NOT objTextFile.AtEndOfStream
      result_array = Split(objTextFile.ReadLine,",")
    Loop
    En faisant cela tu écrase ton résultat précédent à chaque tour de boucle.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ced600 Voir le message
    En faisant cela tu écrase ton résultat précédent à chaque tour de boucle.
    Pas faux... enfin, j'ai cherché sur le net, fini par trouver une solution adaptable à ce que je faisais... Au lieu de chercher à créer un tableau à deux dimensions à partir de mon fichier csv, j'ai créé un tableau contenant chaque ligne du fichier... Que j'ai "splitté" au moment opportun, ce qui, en plus, a facilité mon traiment, puisque, plutôt que de comparer les cases une à une, je comparais des lignes...
    Oui, le but, au final, c'était ça, prendre deux fichiers CSV, se rendre compte des modifications et passer les modifications dans une appli tierce. Donc, au final, voilà ce que j'ai fait:
    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
     
    Function csv_to_table(file_name)
     
    	Set FSO = CreateObject("Scripting.FileSystemObject")
    	Set File = FSO.OpenTextFile(file_name, 1)
     
    	intSize = 0
     
    	Do Until File.AtEndofStream
    		strNextLine = File.ReadLine
    		If InStr (strNextLine, ",") Then
    				ReDim Preserve arrTxtArray(intSize)
    				arrTxtArray(intSize) = strNextLine
    				intSize = intSize +1
    		End If
    	Loop
    csv_to_table = arrTxtArray
    End Function
    Et ensuite, j'ai pris chaque ligne dans ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    update_table = add_or_remove(old_file,newfile)
    For i = LBound(update_table) to UBound(update_table)
       newArray = Split(update_table(i),",")
    Next
    add_or_remove étant une fonction comparant les deux fichiers de base, et renvoyant les différence dans update_table (un tableau contenant un ligne CSV ^^), avec 0 en début de ligne si besoin de supprimer, et 1 si besoin d'ajouter.

    Bref, j'espère que j'ai été clair, une dernière question cependant... Comment faire pour afficher [résolu] dans le titre du message ???
    Edit 3 secondes plus tard: J'ai trouvé

    Et merci à tous

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Dans le post sur les doublons un peut plus bas sur le forum il y a un exemple de fonction stockant dans un dictionnaire les lignes du fichier (sauf les doublons).
    Un dictionnaire est une liste de couple key,value.
    Key et value peuvent être des string, int, tableau de string, ...

    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
    Function Doublon ()
     
    Const ForReading = 1
    Const ForWriting = 2
    Set objDictionary = CreateObject("Scripting.Dictionary")
     
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile _
    ("C:\...\login.txt", ForReading)
     
    Do Until objFile.AtEndOfStream
    strName = objFile.ReadLine
    If Not objDictionary.Exists(strName) Then
    objDictionary.Add strName, strName
    End If
    Loop
     
    objFile.Close
     
    Set objFile = objFSO.OpenTextFile _
    ("C:\...\login.txt", ForWriting)
     
    For Each strKey in objDictionary.Keys
    objFile.WriteLine strKey
     
    Next
     
    objFile.Close
    Si tu arrives à utiliser les dictionnaires (pas très compliqué, un mixte entre liste et tableau), tu pourrais améliorer ton script, et faire moins de boucle

    A toi de voir.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/05/2015, 16h21
  2. [CSV] Contenu d'un fichier csv ds un tableau php
    Par -Neo- dans le forum Langage
    Réponses: 2
    Dernier message: 19/09/2008, 17h02
  3. Mettre un fichier csv dans un tableau à deux dimensions
    Par neeux dans le forum Général Python
    Réponses: 5
    Dernier message: 05/03/2007, 16h36
  4. contenu d'un fichier texte dans un tableau
    Par lyoram dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 30/11/2006, 11h15
  5. Réponses: 8
    Dernier message: 06/08/2006, 15h11

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