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 ?
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 ?
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
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![]()
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
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
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:
Cette macro est dans le fichier Excel joint : tu ouvres le fichier ci-dessous et tu cliques sur l'unique bouton.
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
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
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![]()
Partager