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

AppleScript Discussion :

Script pour comparer fichiers csv et créer fichier de sortie


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Par défaut Script pour comparer fichiers csv et créer fichier de sortie
    Bonsoir,
    Est il possible avec Script de comparer de 2 à 7 fichiers .csv et de générer un fichier qui contient chaque plus grandes valeurs issu de la comparaison ?

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour,
    Peux tu être plus précis dans ta demande ?

    J'imagine qu'il faut comparer 2 à 2 les fichiers. Comme il y en a 7 au maximum, cela fait tout de même 21 complaisons à faire !
    Couples de fichiers à comparer : 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 2/3, 2/4, 2/5, 2/6, 2/7, 3/4, 3/5, 3/6, 3/7, 4/5, 4/6, 4/7, 5/6, 5/7 et 6/7.

    Ensuite, que contiennent tes fichiers csv ? Des listes ? A combien de colonnes ? Des chiffres, du texte, les deux ?
    Ces fichiers proviennent-ils d'Excel ?

    Que signifie "plus grandes valeurs issues de la comparaison" ?

    On ne peut t'aider sans comprendre la demande.
    Cordialement

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Par défaut
    Bonjour PBELL,
    Les fichiers que je souhaite exploiter sont des fichiers de polaires de vitesse ( vitesse théorique d'un bateau en fonction du rapport Angle au vent / force du vent )
    Sur une célèbre plateforme de navigation virtuelle, je peux récupérer soit les 2 polaires ( foc / spi ) si je joue sans options (SO) ou les 7 polaires ( foc / spi / solent / trinquette / code 0 / petit Gnk / grand Gnk ) si je joue avec options (AO).
    Il me faut 'fusionner' ces 2 polaires si SO ou les 7 polaires si AO pour pouvoir les interpréter dans un logiciel de routage
    La manip sous excel est longue et fastidieuse, d'ou l'objet de ma demande
    Je sais que c'est possible par contre je ne sais pas comment
    En gros il faut comparer les valeurs une à une de chaque ligne des 2 ou 7 fichiers csv et ne garder que la valeur la plus grande de chaque comparaison pour l'écrire dans le fichier de sortie également en csv

    J'espère être plus claire ?

    Je te joins les liens des 7 fichiers ça sera peut être plus parlant en les visualisant ...


    http://static.virtualregatta.com/vpp...an/vpp_1_1.csv

    http://static.virtualregatta.com/vpp...an/vpp_1_2.csv

    http://static.virtualregatta.com/vpp...an/vpp_1_4.csv

    http://static.virtualregatta.com/vpp...an/vpp_1_8.csv

    http://static.virtualregatta.com/vpp...n/vpp_1_16.csv

    http://static.virtualregatta.com/vpp...n/vpp_1_32.csv

    http://static.virtualregatta.com/vpp...n/vpp_1_64.csv

    Si je suis toujours pas claire dans mes explications n'hésite pas à me le faire savoir

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour,
    Merci pour les 7 fichiers. Ma météo se dégage

    Chacun contient le même format:
    - 31 lignes dont la ligne 1 est toujours identique (TWA, 0, 2, 4,..., 50, 60, 70)
    - 22 colonnes séparées par des ";" dont la première est toujours identique (tua, 30, 35, 40, ...,160, 170, 180)
    Au milieu des données avec des décimales, mais malheureusement des décimales anglo-saxonne (le point et pas la virgule). C'est pas sympathique, mais on résoudra cela plus tard !

    Au vu de ces fichiers, il me semble qu'une macro Excel est bien plus appropriée que Applescript.
    Sur Mac, il faut au moins Excel 2011 (la version 2008 ne gérait pas les macros - merci Microsoft !).

    Ce qui n'est pas encore clair pour moi (désolé, mais si j'adore la voile, je n'utilise pas les vitesses polaires !), c'est ta méthode de comparaison:
    Par exemple, je compare le fichier 1_1 avec le 1_2.
    Je commence par la première ligne de données : Cela doit être la seconde ligne pour sauter les entêtes.
    Pour chaque colonne, tu veux construire une ligne avec le max de chacune des 2 valeurs ?

    Prenons un exemple, ici limité à une ligne de 5 chiffres :
    ligne fichier 1 = 1 2 3 4 5
    ligne fichier 2 = 2 2 1 7 4
    ligne résultat = 2 2 3 7 5
    J'ai mis en rouge la plus grande des 2 valeurs pour chaque colonne, celle qui va dans le résultat.
    Est-ce correct ?

    Et tu veux la même chose pour toutes les lignes ?
    Le résultat sera un tableau de 31 lignes et 22 colonnes.
    Suis-je toujours sur la bonne voie ?

    Si oui, passons aux fichiers, comment sais tu si tu dois comparer 2 fichiers (lesquels parmi les 7) ou les 7.

    Une fois ces points confirmés/clarifés, la macro Excel ne devrait pas être difficile !
    Pour savoir le niveau d'aide que tu souhaites, as tu déjà écris des macro Excel ?
    Cordialement

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Par défaut
    Bonsoir PBELL,
    Désolé de pas répondre plus tôt mais trop de taf ...

    Effectivement c'est ce que je souhaite obtenir, en gros de la C3 à V31 je souhaite extraire la valeur de la cellule qui est la plus élevé des 2 feuilles ou des 7 feuilles.

    J'ai une piste avec cette feuille Excel en PJ mais j'ai pas encore eu le temps de m'y intéresser et visiblement j'ai pas le choix de sélectionner mode SO - Sans Options - ( vpp_1_1.csv et vpp_1_2.csv ) ou mode AO - Avec Options - ( vpp_1_1. csv / vpp_1_2.csv / vpp_1_4.csv / vpp_1_8.csv / vpp_1_16.csv / vpp_1_32.csv et vpp_1_64.csv )
    J'ai M$ Office 2016 à jour sur le Mac

    Cdlt
    Fichiers attachés Fichiers attachés

  6. #6
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir,
    Merci de cette confirmation.
    J'ai donc opté pour une macro Excel qui va demander successivement les 2 ou 7 fichiers à ouvrir (tu cliques annuler lorsque tu as déjà sélectionné le nombre de fichiers csv à traiter.

    Si tu as sélectionné moins de 2 fichiers, la macro s'arrête (on ne peut comparer un seul fichier).
    Le nombre maximum de fichiers qu'il est possible de comparer est indiqué dans une constante en début de la macro.

    La macro, qui se lance simplement avec le bouton (voir fichier Excel joint), crée un nouveau document Excel avec un onglet par fichier csv et ajoute un onglet supplémentaire qui contient le résultat attendu : pour chaque cellule, le max entre les mêmes cellules de tous les autres onglets.

    Voici la macro elle-même, avec, comme d'habitude, beaucoup de commentaires pour qu'elle puisse être adaptée si nécessaire:

    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
    Const FMax = 7 ' nombre max de fichiers possible
    Const Lig1 = 2, LigMax = 31 ' position des lignes de données de chaque feuille
    Const Col1 = 2, ColMax = 22 ' position des colonnes de données de chaque feuille
     
     
    Global NbFichier As Integer ' nombre de fichiers sélectionnés
    Global NomFichier(FMax) As String ' noms des fichiers sélectionnés
    Global NomFeuille(FMax) As String ' nom des feuilles dans lesquels sont les fichiers
    Global WB As String
     
     
    Sub Regrouper()
    ' P_Bell / Developpez.com
    ' Juin 2017
     
     
    ' Demande à l'utilisateur de 1 à 10 fichiers csv maximum
    ' 1) crée un nouveau workbook
    ' 2) ouvre chacun des fichiers dans une feuille (séparateur ; et conversion des . décimaux en ,)
    '    format entêtes de A1 à V1 (22 colonnes)
    '    format première colonne A de la ligne 2 à la ligne 31
    ' 3) construit un feuille de résultat qui contient, outre la ligne d'entête et la 1ère colonne, la valeur maximale des X autre feuilles
     
     
     
     
    ' sélection de 1 à N fichier (max = FMax)
    NumFichier = 0
    Ucontinue = True
    While Ucontinue And (NumFichier < FMax) ' on boucle pour demander les fichiers cvs tant qu'on a pas le max ou que l'utilisateur n'a pas annulé
    Reponse = MsgBox("Veuillez sélectionné le fichier N° " & (NumFichier + 1) & "." & Chr(13) & "Cliquer sur annuler pour terminer la sélection", vbOKCancel)
    If Reponse = vbCancel Then
            Ucontinue = False 'l l'utilisateur a cliqué sur Annuler, on arrête la boucle de demande des fichiers
        Else
            Fichier = Application.GetOpenFilename()
            If Fichier = False Then
                    Ucontinue = False ' L'utilisateur n'a pas sélectionné de fichier on sort de la boucle
                Else
                    NumFichier = NumFichier + 1
                    NomFichier(NumFichier) = Fichier
                End If
        End If
    Wend ' boucle pour demander le prochain fichier
    If NumFicher = FMax Then MsgBox "Le nombre maximum de fichier est atteint !" & Chr(13) & "Le traitement va commencer."
    If NumFichier < 1 Then
        MsgBox " Moins de 2 fichiers sélectionnés : abandon !"
        Exit Sub
        End If
     
     
    ' crée un nouveau workbook pour stocker les fichiers
    Workbooks.Add
    WB = ActiveWorkbook.Name
    ActiveSheet.Name = "Resultat"
    ' boucle sur chaque fichier pour l'ouvrir et le copier dans un onglet
    For I = 1 To NumFichier
        '  Avec un fichier csv on ne peut pas utiliser directement les séparateurs, donc on l'ouvre comme un texte brut
      Workbooks.Open Filename:=NomFichier(I)
       ' conversion de la colonne en colonnes par utilisation des ; comme séparateurs et le . comme séparateur décimal
       Range(Cells(1, 1), Cells(LigMax, 1)).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False, Space:=False, Other:=True, OtherChar:=";", _
            FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1) _
            , Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1)), DecimalSeparator:="."
     
     
    'copie de la feuille convertie sur le workbook vierge (ce qui referme le csv
        NomFeuille(I) = ActiveSheet.Name
        Sheets(NomFeuille(I)).Move After:=Workbooks(WB).Sheets("Resultat")
    Next I ' fichier suivant
     
     
    ActiveSheet.Range(Cells(1, 1), Cells(LigMax, ColMax)).Copy ' copie le dernier fichier sur la feuille de résultat (cela copie tous les entêtes de ligne et colonne)
    Sheets("Resultat").Activate
    ActiveSheet.Paste
     
     
    ' construction de la formule : chaque cellule du résultat = le max de toutes les mêmes cellules des autres feuilles
    SFormule = "=MAX("
    For I = 1 To NumFichier
        SFormule = SFormule & NomFeuille(I) & "!RC"
        If I < NumFichier Then SFormule = SFormule & ","
    Next I
    SFormule = SFormule & ")"
    Range(Cells(Lig1, Col1), Cells(LigMax, ColMax)).FormulaR1C1 = SFormule ' application de la formule
    End Sub
    Cette macro est dans le fichier Excel joint : tu ouvres le fichier ci-dessous et tu cliques sur l'unique bouton.
    Tu choisis tes csv en boucle jusqu'à 7 ou jusqu'à ton annulation de sélection.
    Je précise que les fichiers csv originaux ne sont pas modifiés.

    Macro V01.xlsm
    Cordialement

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Par défaut
    Alors là comment dire ... Chapeau l'artiste !!!

    Plus simple à l'utilisation c'est pas possible de le faire, tu viens de me faire gagner un temps précieux ( oui je me cognais les 2 ou 7 fichiers à la main cellules par cellules c'était un travail de titan et pas à l'abri d'une erreur ...

    Merci pour ton travail

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

Discussions similaires

  1. [Toutes versions] Ventiler mon fichier .csv en plusieurs fichiers .csv
    Par X.e.N.o.N dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/07/2018, 05h11
  2. [Batch] Découper un fichier CSV en plusieurs fichiers CSV de 3000 lignes
    Par skyser dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 17/06/2016, 17h12
  3. Script pour insérer une ligne dans un fichier csv
    Par StéphanieB. dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 05/01/2010, 11h19
  4. script pour convertir une table HTML en fichier CSV (ou excel)
    Par whitespirit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 20/08/2008, 08h30
  5. Réponses: 12
    Dernier message: 07/12/2005, 18h42

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