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 :

Contenu d'un CSV dans un tableau 2D


Sujet :

VBScript

  1. #1
    Invité
    Invité(e)
    Par défaut Contenu d'un CSV dans un tableau 2D
    Salut tout le monde,

    Ma question est simple, et malheureusement je n'ai pas pu trouver la solution que je cherchais.
    Alors : j'aimerais tout simplement lire un fichier CSV, et mettre les valeurs dans un tableau 2D.

    Cela me permettra pas la suite de modifier certaines colonnes avec des traitements.

    Je vous remercie d'avance,

    Alexandre

  2. #2
    Expert confirmé
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 844
    Par défaut
    peut-être une piste
    Lecture d'un fichier.csv et stockage dans un tableau en HTML

    Sinon, reformuler votre requête en précisant bien vos besoins réels.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Justement, ce n'est pas pour une application web.
    Je suis sur un logiciel dont on peut incorporer des scripts (en JSript ou VBScript).

    Mais ces scripts n'ont rien à voir avec internet.

    Du coup j'aimerais lire un CSV dans un premier temps, mettre ses valeurs dans un tableau 2D, faire un traitement, puis mettre le résultat après traitement dans un fichier text .txt.

    Je regarde quand même ton lien, merci

  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

    Il faut lire le fichier CSV ligne par ligne (ou spliter l'ensemble du fichier avec avec vbNewLine), cette ligne tu l'as Split.
    Le premier indice de ton tableau 2D sera le numéro de ligne, le second indice sera le x numéro de colonne du split de la ligne.

    En utilisant le lien mis par hackoofr, tu pourras commencer a écrire un petit bout de code que tu pourras nous soumettre si tu as des difficulté de mise en œuvre.
    :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
    Expert confirmé
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 844
    Par défaut

    Vous pouvez commencer par poster une partie de votre fichier.csv à traiter et commencer à pondre un début de code

  6. #6
    Invité
    Invité(e)
    Par défaut
    Malheureusement, je n'ai aucune idée de comment faire.

    Je n'ai pas fait de VBScript depuis 1 an.

    Le fichier.csv est aléatoire en nombre de lignes et de colonne. Cependant le séparateur c'est le point virgule ";".

    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
    Dim st, tab, elem, i, k, j
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("C:\Users\Monique\Downloads\test.csv", 1)
    OutFile = "test.txt"
     
    st = objFile.ReadAll
    tab = split(st,vbcrlf)
    For i=0 to Ubound(tab)
    	elem=split(tab(i),";")
    	For j=0 to Ubound(elem)
    		k=j+1
    		if k=Ubound(elem) then 
                exit for
                end if
    	Next
    Next
     
    MsgBox tab(0,0)
    Erreur ligne 17 : indice en dehors de la plage.

    Je fais un test sur un fichier type :

    val1;1;11
    val2;2;22
    val3;3;33

    Suis je sur la bonne voie?

    EDIT : i est bien incrémenté à 3, mais j reste à 1. Msg Box tab(0) me donne la première ligne, tab(1) la deuxième et tab(2) la troisième.
    Dernière modification par Invité ; 05/06/2013 à 11h29.

  7. #7
    Expert confirmé
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 844
    Par défaut

    Testez ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Const ForReading = 1, ForWriting = 2 
    Dim oFso, f
    Set oFso = CreateObject("Scripting.FileSystemObject")
    Set f = oFso.OpenTextFile("C:\Users\Monique\Downloads\test.csv", ForReading)
    while Not f.AtEndOfStream 
        SrtLine = f.ReadLine
        MsgBox SrtLine,64,"Info" 
        Tab = Split(SrtLine,";")
        For i = LBound(Tab) to UBound(Tab)
            MsgBox Tab(i),64,"Info" 
        Next
    Wend
    f.Close

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup hackoof.

    Cependant il m'affiche dans l'ordre :

    val1;1;11
    val1
    1
    11
    val2;2;22
    val2
    2
    22
    val3;3;33
    val3
    3
    33

    Je ne veux pas garder val1;1;11 | val2;2;22 | val3;3;33 dans mon tableau

    et ma dernière question, comment faire pour afficher une valeur précise ?

    J'ai fait :

    ou

    Mais rien ne marche ?

    EDIT : en retirant la ligne MsgBox SrtLine,64,"Info" j'ai plus le problème pour les val1;1;11 | val2;2;22 | val3;3;33 mais tjr pour mon second problème :/

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

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    bonjour,
    le tableau final doit-il être rectangulaire ou doit-il suivre strictement le nb d'items de chaque ligne ?
    autrement dit un ragged array voir ici
    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

  10. #10
    Invité
    Invité(e)
    Par défaut
    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
    Const ForReading = 1, ForWriting = 2 
    Dim oFso, f
    Set oFso = CreateObject("Scripting.FileSystemObject")
    Set f = oFso.OpenTextFile("C:\Users\Monique\Downloads\test.csv", ForReading)
    i=0
    Dim tab2(2,2)
    while Not f.AtEndOfStream 
        SrtLine = f.ReadLine
        Tab = Split(SrtLine,";")
        For j = 0 to UBound(Tab)
    		tab2(i,j)=Tab(j)
        Next
    	i=i+1
    Wend
    f.Close
     
    For d=0 to i-1
    	For e=0 to j-1
    		MsgBox tab2(d,e)
    	Next
    Next
    Voilà ça m'affiche tout, ça marche.
    Maintenant je connais pas à la base le nombre de lignes et de colonnes de mon fichier csv. Comment faire ? J'ai vu les tableaux dynamiques, mais uniquement pour les tableaux 1D.

    Merci

    EDIT :

    Si dans mon fichier j'ai :

    val1;1;11
    val2;2;22
    val3;3;33

    J'aimerais avoir un tableau :

    val1 1 11
    val2 2 22
    val3 3 33

    Par ailleurs, le contenu peut avoir 4 lignes et 2 colonnes... il n'est pas forcément carré (3,3 ou 2,2)
    Dernière modification par Invité ; 05/06/2013 à 15h35.

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

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    il n'est pas forcément carré
    c'était rectangulaire mais ce n'est pas grave
    je connais pas à la base le nombre de lignes et de colonnes de mon fichier csv. Comment faire ?
    en vbs le redimensionnement des tableaux dynamiques avec préservation des données ne peut porter que sur la dernière
    il y a plusieurs approches :
    - si le fichier ne fait pas plus de quelques Mo, il est peut être plus simple de suivre le conseil de ProgElecT (message #4) et de lire en bloc le fichier
    - faire un 1ère boucle de lecture pour initialiser les limites du tableau dynamique et une 2ème pour le remplir
    - définir d'emblée un tableau avec des valeurs garantissant tout risque de débordement...
    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

  12. #12
    Invité
    Invité(e)
    Par défaut
    C'est bon j'ai réussi avec ReDim :

    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
    Const ForReading = 1, ForWriting = 2 
    Dim oFso, f
    Set oFso = CreateObject("Scripting.FileSystemObject")
    Set f = oFso.OpenTextFile("C:\Users\Monique\Downloads\test.csv", ForReading)
    i=0
    k=0 ''number of lines
    m=0
     
    while Not f.AtEndOfStream 
        SrtLine = f.ReadLine
        Tab = Split(SrtLine,";")
    	k=k+1 
        For j = 0 to UBound(Tab)
    		m=m+1
        Next
    Wend
     
    z=m/k '' number of columns
    MsgBox "lines : " &k & "columns :" & z
     
    Dim tab2()
    ReDim tab2(k,z)
     
    while Not f.AtEndOfStream 
        SrtLine = f.ReadLine
        Tab = Split(SrtLine,";")
     
        For j = 0 to UBound(Tab)
    		tab2(i,j)=Tab(j)
        Next
    	i=i+1
    Wend
     
    MsgBox i & " " & j
    For d=0 to k
    	For e=0 to z
    		MsgBox tab2(d,e)
    	Next
    Next
     
    f.Close
    Ca m'affiche bien le nombre de colonnes et de lignes dans le premier MsgBox. j prend bien la bonne valeur pour le nombre de colonnes, mais i reste à 0...
    Et je n'ai donc rien qui s'affiche dans ma MsgBox tab(d,e) ?

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

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    ton code est un peu particulier...
    comme tu sembles avoir choisi la 2ème option, voici la solution
    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
    Const ForReading = 1, ForWriting = 2 
    Dim oFso, f
    Set oFso = CreateObject("Scripting.FileSystemObject")
    Set f = oFso.OpenTextFile("C:\Users\Monique\Downloads\test.csv", ForReading)
    ln=-1
    cl=0
     
    while Not f.AtEndOfStream '1ère itération pour définir les limites
      ln=ln+1 'définition indice lignes
      Tab=Split(f.ReadLine,";")
      If cl < UBound(Tab) Then cl = UBound(Tab) 
    Wend
    f.Close
    MsgBox "indice lignes : " & ln & "indice colonnes :" & cl
     
    Dim Tab2()
    ReDim Tab2(ln,cl)
    Set f = oFso.OpenTextFile("C:\Users\Monique\Downloads\test.csv", ForReading)
    i=0
    while Not f.AtEndOfStream ' 2ème itération pour remplir le tableau
      Tab = Split(f.ReadLine,";")
      For j = 0 to UBound(Tab)
        Tab2(i,j) = Tab(j)
      Next
      i=i+1
    Wend
    f.Close
     
    For i=0 to UBound(Tab2,1) ' vérification
      For j=0 to UBound(Tab2,2)
        MsgBox Tab2(i,j)
      Next
    Next
    nb : ln et cl sont des indices de tableau de base 0. le nb de lignes et de colonnes est donc ln+1 et cl+1
    nb1 : comme le tableau Tab2 est rectangulaire, certains items peuvent être vierges
    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

  14. #14
    Expert confirmé
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 844
    Par défaut
    Omen999, je me demande, si je ne raconte pas des histoires
    Dans la ligne N°11, on peut écrire directement cl = UBound(Tab)
    Sans passer par la condition If cl < UBound(Tab) Then cl = UBound(Tab) puisque c'est toujours vérifié après un Split pour compter le nombre de colonnes ?

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

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut

    e me demande, si je ne raconte pas des histoires
    je confirme
    si tu omets le test, cl conservera le nb de colonnes (moins un) de la dernière ligne du fichier alors qu'il peut exister des lignes précédentes
    avec plus de colonnes....
    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

  16. #16
    Expert confirmé
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 844
    Par défaut
    Pour afficher les résultats dans un fichier texte
    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
    Const ForReading = 1, ForWriting = 2 
    Dim oFso, f
    Set oFso = CreateObject("Scripting.FileSystemObject")
    Set f = oFso.OpenTextFile("C:\Users\Monique\Downloads\test.csv", ForReading)
    ln=-1
    cl=0
     
    while Not f.AtEndOfStream '1ère itération pour définir les limites
      ln=ln+1 'définition indice lignes
      Tab=Split(f.ReadLine,";")
      If cl < UBound(Tab) Then cl = UBound(Tab) 
    Wend
    f.Close
    MsgBox "indice lignes  = " & ln & Vbcr & "indice colonnes = " & cl,64,"Information"
     
    Dim Tab2()
    ReDim Tab2(ln,cl)
    Set f = oFso.OpenTextFile("C:\Users\Monique\Downloads\test.csv", ForReading)
    i=0
    while Not f.AtEndOfStream ' 2ème itération pour remplir le tableau
      Tab = Split(f.ReadLine,";")
      For j = 0 to UBound(Tab)
        Tab2(i,j) = Tab(j)
      Next
      i=i+1
    Wend
    f.Close
     
    Dim OutPut : OutPut = "OutPut_Resultat.txt"
    Set f = oFso.OpenTextFile(OutPut,ForWriting,True)
    Set ws = CreateObject("Wscript.Shell")
     
    For i=0 to UBound(Tab2,1) ' vérification
      For j=0 to UBound(Tab2,2)
        f.WriteLine "La valeur de Tab2("&i&","&j&") ===> "& Tab2(i,j)
        'MsgBox Tab2(i,j)
      Next
    Next
    f.WriteLine VbNewline & "******************************************"
    f.WriteLine "La valeur de Tab2(1,1) ===> "& Tab2(1,1)
    ws.run "Notepad " & OutPut

  17. #17
    Invité
    Invité(e)
    Par défaut
    Salut !

    J'ai fait ça et ça marche impec :

    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 fsot, ft   
    Set fsot = CreateObject("Scripting.FileSystemObject")
    Set ft = fsot.OpenTextFile("C:\Users\Monique\Downloads\lolololololol.txt", 2,true)
    m=0
     
    For i=0 to UBound(Tab2,1) ' vérification
    	For j=0 to UBound(Tab2,2)
    		If m <> cl Then 
    			ft.write(Tab2(i,j) & "	")
    			m=m+1
    		Else
    			ft.write(vbcrlf)
    			m=0
    		End If
    	Next
    Next
    Une question : pourquoi ln est initialisé à -1 et cl à 0 ?

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

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    "C:\Users\Monique\Downloads\lolololololol.txt"
    content de voir que ça t'a plu
    pourquoi ln est initialisé à -1 et cl à 0 ?
    parce que s'il y a une ligne, il y a nécessairement au moins une colonne alors que si le fichier est vide, il n'y a pas de ligne...
    maintenant, il ya 36 façons de coder ce genre de boucle correctement et celle-ci n'est pas nécessairement meilleure qu'une autre
    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

  19. #19
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup à vous deux c'est super sympa de votre part

  20. #20
    Expert confirmé
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 844
    Par défaut
    Citation Envoyé par stalex Voir le message
    Merci beaucoup à vous deux c'est super sympa de votre part

    Moi aussi , je vous remercie tout les deux.
    C'est grâce à vous deux que j'ai appris comment construire un Tableau en 2D
    J'espère que vous avez enfin résolu votre problème de "Matrix"

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

Discussions similaires

  1. Eclater le contenu d'un ".csv" dans un tableau
    Par ghe69140 dans le forum VBScript
    Réponses: 4
    Dernier message: 30/08/2011, 17h50
  2. Réponses: 6
    Dernier message: 05/02/2009, 09h34
  3. [Stream] Mettre le contenu d'un File dans un tableau de byte
    Par JohnBlatt dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 25/08/2006, 14h18
  4. [MySQL] Lister le contenu d'une table dans un tableau HTML
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 03/04/2006, 19h40
  5. Réponses: 4
    Dernier message: 26/01/2006, 14h37

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