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 :

Comparer deux tableaux (.csv) et concatener les lignes


Sujet :

VBScript

  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 Comparer deux tableaux (.csv) et concatener les lignes
    Chers développeurs,

    J'ai deux fichiers txt (des csv)

    toto.txt est sous la forme:
    fchobin,,,,+33653559897,,,GRUND.Raisin,false,false,true
    avidard,,,,+33987858472,,,POUILOU.Toto,false,false,true
    atyuiop,,,,+33745692135,,,HUMPOI.Abricot,false,false,true
    azerty,,,,+33446895383,,,STAMEN.Ivan,true,false,false
    asando,,,,+33879854632,,,STAMEN.Ivan,false,false,true
    asiman,,,,+33689874213,,,PENAU.Jasque,false,false,false
    avolte,,,,+33145685213,,,POUILOU.Toto,true,false,true

    et toto2.txt sous la forme:
    HUMPOI.Abricot,Institut11,HUMPOI.Abricot,,,,FBICIA,Adresse,,false,true
    GRUND.Raisin,Institut32,GRUND.Raisin,,,,FBICIOI,Adresse,,false,true
    POUILOU.Toto,Institut3,POUILOU.Toto,,,,FBICIA,Adresse,,false,true
    STAMEN.Ivan,Institut99,STAMEN.Ivan,,,,FBICIOI,Adresse,,false,true
    PENAU.Jasque,Institut99,PENAU.Jasque,,,,FBICIA,Adresse,,false,true


    Ce que je souhaite c'est comparer les lignes de la colonne 1 de toto2.txt (HUMPOI.Abricot, GRUND.Raisin, POUILOU.Toto, etc...) avec les lignes de la colonne 8 de toto.txt (GRUND.Raisin, POUILOU.Toto, HUMPOI.Abricot, etc...)
    Dès que le contenu est identique, la ligne de toto2.txt identique est collée à la suite de la ligne correspondante dans toto.txt.
    Ex:
    fchobin,,,,+33653559897,,,GRUND.Raisin,false,false,true,GRUND.Raisin,Institut32,GRUND.Raisin,,,,FBICIOI,Adresse,,false,true
    avidard,,,,+33987858472,,,POUILOU.Toto,false,false,true,POUILOU.Toto,Institut3,POUILOU.Toto,,,,FBICIA,Adresse,,false,true
    atyuiop,,,,+33745692135,,,HUMPOI.Abricot,false,false,true,HUMPOI.Abricot,Institut11,HUMPOI.Abricot,,,,FBICIA,Adresse,,false,true
    azerty,,,,+33446895383,,,STAMEN.Ivan,true,false,false,STAMEN.Ivan,Institut99,STAMEN.Ivan,,,,FBICIOI,Adresse,,false,true
    etc...

    J'ai ça pour l'instant (de Pitchalov, il y a bien longtemps déjà...)

    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
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objInfoFile = objFso.OpenTextFile("C:\Users\Desktop\Curl\toto.txt", 1)
     
    Set objFSO2 = CreateObject("Scripting.FileSystemObject") 
    Set objInfoFile2 = objFSO2.OpenTextFile ("C:\Users\Curl\toto2.txt",1)
     
    Dim arrUsers ()
    ReDim arrUsers(21, 0)
    Dim arrUsers2 ()
    ReDim arrUsers2(21, 0)
     
    Do While Not objInfoFile2.AtEndOfStream
    arrTemp2 = Split(objInfoFile2.ReadLine, ",")
    Do While Not (objInfoFile.AtEndOfStream)
    arrTemp = Split(objInfoFile.ReadLine, ",")
    i = 0
    boolUserFind = False
    If arrTemp2(0) = arrUsers(7, i) Then boolUserFind = True 	
    Do While boolUserFind = False AND i < Ubound(arrUsers, 2) 	
    i = i + 1	
    If arrTemp2(0) = arrUsers(7, i) Then boolUserFind = True		
    Loop												
    If boolUserFind = True Then									
    arrUsers(7, i) =  arrUsers(7, i) & arrTemp2(0) 	
    Else													
    Redim Preserve arrUsers (21, Ubound(arrUsers, 2) + 1)		
    arrUsers(0, Ubound(arrUsers, 2) - 1) = arrTemp(0) & "," & arrTemp(1) & "," & arrTemp(2) & "," & arrTemp(3) & "," & arrTemp(4) & "," & arrTemp(5) & "," & arrTemp(6) & "," & arrTemp(7) & "," & arrTemp(8) & "," & arrTemp(9) & "," & arrTemp(10) & "," & arrTemp2(0) & "," & arrTemp2(1) & "," & arrTemp2(2) & "," & arrTemp2(3) & "," & arrTemp2(4) & "," & arrTemp2(5) & "," & arrTemp2(6) & "," & arrTemp2(7) & "," & arrTemp2(8) & "," & arrTemp2(9) & "," & arrTemp2(10)
    End If
    Loop
    Loop
    Redim Preserve arrUsers (21, Ubound(arrUsers, 2) - 1)		
    strTemp = ""
    For i = 0 To Ubound(arrUsers, 2)
    strTemp = strTemp & arrUsers(0, i) & vbnewline 
    Next
    Set Fso = CreateObject("Scripting.FileSystemObject")
     Set f = Fso.OpenTextFile("C:\Users\Curl\totalclients.txt", 2)
          f.Write (strTemp)
    Cependant seule la première ligne de toto2.txt est copiée à la suite de chaque ligne de toto.txt. J'obtiens ça:

    fchobin,,,,+33653559897,,,GRUND.Raisin,false,false,true,GRUND.Raisin,Institut32,GRUND.Raisin,,,,FBICIOI,Adresse,,false,true
    avidard,,,,+33987858472,,,POUILOU.Toto,false,false,true,GRUND.Raisin,Institut32,GRUND.Raisin,,,,FBICIOI,Adresse,,false,true
    atyuiop,,,,+33745692135,,,HUMPOI.Abricot,false,false,true,GRUND.Raisin,Institut32,GRUND.Raisin,,,,FBICIOI,Adresse,,false,true
    azerty,,,,+33446895383,,,STAMEN.Ivan,true,false,false,GRUND.Raisin,Institut32,GRUND.Raisin,,,,FBICIOI,Adresse,,false,true
    etc...

    Edit: "Je viens de repasser des heures dessus, c'est plus compliqué que je pensais. Le problème est d'écrire sur la même ligne, deux lignes contenant le même mot venant de deux fichiers différents ! Je suis sur un gros os, je comprend pas comment faire ça! Je me rend compte que c'est n'importe quoi mon code.... siouplait"
    Je vous remercie par avance et vous adresse mes salutations les plus distinguées cordialement et avec toute mon affection la plus sincère!

  2. #2
    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
    J'ai essayé avec un dictionnaire, mais je tombe sur le même genre d'os

    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
    Const ForReading = 1
    Const strSrcFile1 = "C:\Users\Desktop\Curl\toto.txt", strSrcFile2 = "C:\Users\Desktop\Curl\toto2.txt", strTrgtFile = "C:\Users\Desktop\Curl\toto3.txt"
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objSrcFile2ContentDic = CreateObject("Scripting.Dictionary")
    objSrcFile2ContentDic.CompareMode = vbTextCompare
    Set objSrcFile = objFso.OpenTextFile(strSrcFile2, ForReading)
    intLineCounter = 1
    Do Until objSrcFile.AtEndOfStream
    	strTmpLine2 = Split(objSrcFile.ReadLine, ",")
    	If (NOT strTmpLine2(0) = "") AND (NOT objSrcFile2ContentDic.Exists(strTmpLine2(0))) Then objSrcFile2ContentDic.Add strTmpLine2(0), intLineCounter
    	intLineCounter = intLineCounter + 1
     
    objSrcFile.Close
    Set objSrcFile = objFso.OpenTextFile(strSrcFile1, ForReading)
    Set objTrgtFile = objFso.CreateTextFile(strTrgtFile)
    Do Until objSrcFile.AtEndOfStream
    	strTmpLine = Split(objSrcFile.ReadLine, ",")
     
    	If (NOT strTmpLine(7) = "") AND (objSrcFile2ContentDic.Exists(strTmpLine(7))) Then 
    	If strTmpLine(7) = strTmpLine2(0) Then
    	objTrgtFile.WriteLine(strTmpLine(0) & "," & strTmpLine(1) & "," & strTmpLine(2) & "," & strTmpLine(3) & "," & strTmpLine(4) & "," & strTmpLine2(0))
    	End if
    	End if
    	Loop
    	Loop
     
    objSrcFile.Close
    objTrgtFile.Close
    Please aidez-moi

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Par défaut
    Bonjour,

    Je vois déjà (par exemple) que les déclarations ne sont pas typées, comme:
    "Dim arrUsers ()" devrait être typée en string ("Dim arrUsers() as string").

    Deuxième point; l'utilisation de FSO "alourdi" considérablement l'application, et provoque ainsi une diminution de vitesse d’exécution, en général on évite cette méthode.

    Bon je m'en excuse, j'arrive d'une autre communauté et je suis nouveau ici, et je viens de voir que c'est du VBScript...

    Mais je pense qu'un petit exemple en VB6 pourrait t'aider:

    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
    Dim Tableau1() As String
    Dim Tableau2() As String
    Dim Str_a, Str_b As String
     
    Open "c:\TonFichier1.txt" For Input As #1
    Open "c:\TonFichier2.txt" For Input As #2
       Do While Not EOF(1)
          Line Input #1, Str_a
          Line Input #2, Str_b
          Tableau1 = Split(Str_a, ",")
          Tableau2 = Split(Str_b, ",")
          'Dans le cas de tes fichiers, à la ligne 1:
          '- Tableau1(0) contient "fchobin"
          '- Tableau1(4) contient "+33653559897"
          'etc.
          '- Tableau2(0) contient "HUMPOI"
          '- Tableau2(1) contient "Abricot"
          '- Tableau2(7) contient "FBICIA"
        'etc.
       Loop
    Close
    'Par contre si les fichiers n'ont pas le même nombre de lignes
    'ça risque de poser problème et il faut gérer différemment
    En VBA c'est pareil et si tu le veux en VB.NET je te le fais aussi


    Cordialement

  4. #4
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 127
    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 127
    Par défaut
    Citation Envoyé par ACIVE_CS Voir le message
    Bonjour,
    ..................
    Bon je m'en excuse, j'arrive d'une autre communauté et je suis nouveau ici, et je viens de voir que c'est du VBScript...

    Mais je pense qu'un petit exemple en VB6 pourrait t'aider:
    ..............
    Donc attention, pas de typage en VBScript, pas de Open, ne reste que le Split qui est utilisable.

    VBScript ne nécessite aucun éditeur dédié, Notepad peut convenir.
    Plus pratique, Notepad++ supportant plusieurs langages, couleurs syntactique .....
    :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
    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
    En effet, les deux codes testés sont du vbscript que j'écris en utilise notepad++.
    Et en effet les deux fichiers toto1.txt et toto2.txt ont des longueurs différentes ET variables dans le temps. Mon probleme se situe à ecrire à la suite dune ligne celle qui lui correspond c'est à dire contenant chacune un nom identique....si je me fait bien comprendre. L'exemple à obtenir est dans mon 1er post.

  6. #6
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 127
    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 127
    Par défaut
    Salut grundraisin

    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
    Dim objFso, objInfoFile1, objInfoFile2
    Dim ContenuFichier1, ContenuFichier2
    Dim ContenuLigneFichier1, ContenuLigneFichier2, ContenuColonneFichier1, ContenuColonneFichier2
    Dim NbrLigneF1, NbrLigneF2
    Dim ContenuFichierFinal
    Dim Cpt1, Cpt2
     
    Set objFso = CreateObject("Scripting.FileSystemObject")
    'Set objInfoFile = objFso.OpenTextFile("C:\Users\Desktop\Curl\toto.txt", 1)
    Set objInfoFile1 = objFso.OpenTextFile("C:\PersoFrancis\En VBScript et HTA\Exemple\toto.txt", 1)
    ContenuFichier1 = objInfoFile1.ReadAll
    objInfoFile1.Close
    ContenuLigneFichier1 = Split(ContenuFichier1, vbNewLine)
    NbrLigneF1 = UBound(ContenuLigneFichier1) + 1
     
    'Set objInfoFile2 = objFso.OpenTextFile("C:\Users\Curl\toto2.txt", 1)
    Set objInfoFile2 = objFso.OpenTextFile("C:\PersoFrancis\En VBScript et HTA\Exemple\toto2.txt", 1)
    ContenuFichier2 = objInfoFile2.ReadAll
    objInfoFile2.Close
    ContenuLigneFichier2 = Split(ContenuFichier2, vbNewLine)
    NbrLigneF2 = UBound(ContenuLigneFichier2) + 1
     
     
    For Cpt1 = 0 To NbrLigneF1 - 1
        ContenuFichierFinal = ContenuFichierFinal & ContenuLigneFichier1(Cpt1)
        ContenuColonneFichier1 = Split(ContenuLigneFichier1(Cpt1), ",")
        For Cpt2 = 0 To NbrLigneF2 - 1
            ContenuColonneFichier2 = Split(ContenuLigneFichier2(Cpt2), ",")
            If ContenuColonneFichier1(7) = ContenuColonneFichier2(0) Then
                ContenuFichierFinal = ContenuFichierFinal & "," & ContenuLigneFichier2(Cpt2)
                Exit For
            End If
        Next
        If Cpt1 <> NbrLigneF1 - 1 Then ContenuFichierFinal = ContenuFichierFinal & vbNewLine
    Next
     
    'Set objInfoFile = objFso.OpenTextFile("C:\Users\Curl\totalclients.txt")
    Set objInfoFile1 = objFso.CreateTextFile("C:\PersoFrancis\En VBScript et HTA\Exemple\toto3.txt", True)
    objInfoFile1.write ContenuFichierFinal
    objInfoFile1.Close
     
    Set objFso = Nothing
    Il te reste, pour comprendre et ne pas faire un simple copier/coller, à voire les explications de chaque mots clés en consultant la FAQ VBScript et/ou l'aide en ligne pour VBScript que tu peux télécharger depuis DVP Où trouver l'aide en ligne pour VBScript ?
    :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 ← ← 👈

  7. #7
    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
    C'est tout simplement et absolument magnifique! Merci beaucoup ProgElecT.
    Je comprend chacune de tes lignes mais c'est la manière de les imbriquer qui me laisse .
    Si j'ai bien compris:
    D'abord tu split chaque fichier par ligne et mémorise le nbre de chacune par ubound. Puis pour chaque n° de ligne (Cpt1 et Cpt2) jusqu'à la fin du fichier (NbrLigneF1 et 2) tu split chacune des lignes en colonne et si valeur dans colonne de chaque fichier identique alors concatène. Puis si le n° de ligne <> du nbre total de ligne alors continu d'écrire et saute des lignes!
    Il me manquait entre autre (enfin non....il me manquait grave plein de trucs) ce raisonnement, le:
    For Cpt1=0 to NbrLigneF1 - 1
    et utiliser cette "numérotation" des lignes pour les comparer. Je suis béat.
    Merci beaucoup ça marche impec!
    Donc un gros et un gros et un grand

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

Discussions similaires

  1. [Tableaux] Comparer deux tableaux
    Par popy67 dans le forum Langage
    Réponses: 2
    Dernier message: 05/05/2008, 07h22
  2. Comparer deux tableaux
    Par gefrey54 dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 12/09/2007, 10h58
  3. Réponses: 2
    Dernier message: 04/05/2006, 13h10
  4. comparer deux tableaux
    Par djibril dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 15h26

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