Question
Exporter résultats Cplex vers Excel via Powershell
- Forez Thomas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 3
- Remerciements reçus 0
J'utilise Powershell pour lancer une boucle résolvant 20 fois un modèle d'optimisation Cplex de \"facility location\" avec 20 jeux de données différents (20 fichiers .dat donc). Etant débutant avec Powershell, j'utilise pour l'instant une solution que l'on m'a fournie et qui enregistre les résultats en fichiers .log. Malheureusement Notepad n'est pas très pratique pour analyser et manipuler les résultats. J'aimerai donc enregistrer ces résultats dans des fichiers Excel.
Voici mon script Powershell actuel:
[code:1]$user = [Environment]::UserName
$date = Get-Date -f \"dd-MM-yyyy\"
Write-Output (\"Bonjour \" + $user + \" ! \" + $date)
# lancement successif d'oplrun
#Invoke-Item oplrun
$nbDats = 20
$CMD = 'C:\Program Files\IBM\ILOG\CPLEX_Studio125\opl\bin\x64_win64\oplrun.exe'
$modFile = 'O:\Cplex workspace\Classic Model\Classic Model.mod'
#$compile = '-e compiledOutput.lp'
for($i=1 ; $i -le $nbDats; $i++){
$path = 'O:\R-workspace\Classic\'
$datFile = 'O:\R-workspace\Classic\' + 'Classic_' + $i + '.dat'
$outputFile = 'O:\R-workspace\Classic\' + 'Classic_' + $i + '.log'
& $CMD $modFile $datFile | Out-File $outputFile
notepad $outputFile
}
[/code:1]
J'ai essayé simplement de remplacer le .log par .csv mais cela enregistre tous mes résultats dans la première colonne.
Idéalement, j'aimerai générer 20 feuilles de résultats dans un fichier excel unique.
J'ai quelque peu cherché et j'ai trouvé des informations du genre:
[code:1]$Excel = New-Object -ComObject \"Excel.Application\"
$WorkBook = $Excel.Workbooks.Add()
$WorkSheet = $WorkBook.WorkSheets.Add()
$WorkSheet.Name = \" xxx ”
$WorkSheet.Select()
$WorkSheet.Cells.Item(1,1) = \" yyy \"
$WorkBook.SaveAs(\" zzz \"«»)
$Excel.Visible = $true[/code:1]
Malgré celà, je ne maîtrise pas assez Powershell et je n'ai vraiment aucune d'idée de la manière d'implémenter celà à mon script initial.
Je vous remercie d'avance pour votre attention.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Tfo89 écrit:
Il faut déjà vérifier le format du fichier d'origine, de plus le délimiteur est par défaut la virgule (US) et la point-virgule en Français. Peut être que l'usage du paramètre -Delimiter sur le cmdlet Import-CSV est nécessaire.J'ai essayé simplement de remplacer le .log par .csv mais cela enregistre tous mes résultats dans la première colonne.
Un exemple de qq lignes de données de ton fichier d'origine serait apprécié.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Forez Thomas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 3
- Remerciements reçus 0
Voici à quoi ressemble un de mes fichiers de données .dat:
// Set
Factories = {\"Factory 1\",\"Factory 2\",\"Factory 3\",\"Factory 4\",\"Factory 5\",\"Factory 6\",
\"Factory 7\",\"Factory 8\",\"Factory 9\",\"Factory 10\"};
Customers = {\"Customer 1\",\"Customer 2\",\"Customer 3\",\"Customer 4\",\"Customer 5\",
\"Customer 6\",\"Customer 7\",\"Customer 8\",\"Customer 9\",\"Customer 10\"};
// Data
cost=[[34, 18, 23, 32, 16, 16, 19, 22, 38, 27],
[21, 28, 20, 31, 18, 38, 39, 39, 24, 19],
[38, 22, 17, 39, 38, 38, 32, 36, 36, 33],
[18, 31, 25, 18, 32, 24, 37, 37, 33, 21],
[31, 39, 18, 39, 35, 40, 37, 21, 29, 30],
[19, 29, 34, 27, 15, 16, 24, 39, 29, 26],
[31, 21, 23, 31, 38, 22, 36, 37, 23, 33],
[28, 32, 20, 32, 27, 26, 26, 27, 31, 37],
[40, 21, 36, 17, 19, 21, 17, 15, 28, 27],
[36, 37, 16, 33, 16, 20, 20, 20, 25, 18]];
opencost=[2000,2000,2000,2000,2000,2000,2000,2000,2000,2000];
maxcapacity=[4000,4000,4000,4000,4000,4000,4000,4000,4000,4000];
demand=[38,34,32,39,36,32,17,38,23,24];
Après avoir lancé mon script présenté dans mon premier post (qui fait donc passer mes fichiers .dat dans mon modèle Cplex), j'obtiens ceci comme fichier .log de résultats:
<<< solve
OBJECTIVE: 9556
Open Factories : [0 0 0 0 0 0 0 0 1 0]
opencost : [2000 2000 2000 2000 2000 2000 2000 2000 2000 2000]
flows : [[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[38 34 32 39 36 32 17 38 23 24]
[0 0 0 0 0 0 0 0 0 0]]
production : [0 0 0 0 0 0 0 0 313 0]
<<< post process
<<< done
Si j'enregistre en .csv, j'obtiens le même résultat avec toutes les informations dans la première colonne d'Excel.
Mon but est de pouvoir stocker les résultats colonnes par colonnes pour pouvoir les manipuler plus facilement. Par exemple la colonne 1 reprendrait Open Factories, la colonne 2 opencost, la colonne 3 flows et ainsi de suite.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Pour l'exemple cité on peut parser le texte, mais avant d'aller plus loin il faudrait étudier les possibles résultats issus du traitement. Les colonnes seront-elles tjrs les mêmes et avec le même nombre de ligne ( 1 ou +),etc.Mon but est de pouvoir stocker les résultats colonnes par colonnes pour pouvoir les manipuler plus facilement. Par exemple la colonne 1 reprendrait Open Factories, la colonne 2 opencost, la colonne 3 flows et ainsi de suite.
Je ne connais pas ce produit, mais en recherchant rapidement, et au vu du prix du produit, il semble possible d'extraire des données vers XL .
Il existe aussi des classes dotnet .
Je ne répond pas vraiment à ton problème, car sans spécifications précises sur le format, difficile de proposer des solutions.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
[code:1]
$S=@'
<<< solve
OBJECTIVE: 9556
Open Factories : [0 0 0 0 0 0 0 0 1 0]
opencost : [2000 2000 2000 2000 2000 2000 2000 2000 2000 2000]
flows : [[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]
[38 34 32 39 36 32 17 38 23 24]
[0 0 0 0 0 0 0 0 0 0]]
production : [0 0 0 0 0 0 0 0 313 0]
<<< post process
<<< done
'@
#Filtre des lignes concernées
$Filtre ='(^\[|^o|^f|^p)'
#séparateur d'éléments de tableau
$ofs='@'
#Traitement de concaténation des lignes du champ 'Flows' ou
#de tout autre champ construit sur le même principe
# $s -split \"`n\" : Converti la chaîne $S en un tableau de chaine,
# -match $Filtre : puis les filtre, on reçoit un tableau
# \"$(...)\" : chaque élément du tableau est concaténée et séparée par un '@', puis
#-replace ']@\ [' : on remplace seulement les occurrences des données associées
# au champ nommé 'flows'
$l=\"$($s -split \"`n\" -match $Filtre)\" -replace ']@\ ['
$ofs=' '
# et enfin on découpe à nouveau les champs séparés par '@'
$tab=$l -split '@'
$tab
# OBJECTIVE: 9556
# Open Factories : [0 0 0 0 0 0 0 0 1 0]
# opencost : [2000 2000 2000 2000 2000 2000 2000 2000 2000 2000]
# flows : 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 ... 0 0
# production : [0 0 0 0 0 0 0 0 313 0]
#Capture nommées
$regex ='(?<Name>(^o|^f|^p)(.*)):«»(?<Datas>(.*)]{0,1}$)'
$Result=foreach($Line in $Tab)
{
if ($Line -match $regex)
{
#Construit une hashtable ordonnée compatible PS v2
#On récupère le résultat de l'exécution de la regex ($matches)
$H=new-object System.Collections.Specialized.OrderedDictionary
$H.Name=$Matches.Name.Trim()
$H.Datas=$Matches.Datas.Trim()
#renvoi un objet
New-Object PSObject -Property $H
}
}
$Result
# Name Datas
# ----
# OBJECTIVE 9556
# Open Factories 0 0 0 0 0 0 0 0 1 0]
# opencost [2000 2000 2000 2000 2000 2000 2000 2000 2000 2000]
# flows [[0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 ...
# production [0 0 0 0 0 0 0 0 313 0]
$Result |Export-csv C:\temp\OPL1.csv -Delimiter ';' -encoding utf8 -NoTypeInformation
Type C:\temp\OPL1.csv
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 12/05/14 13:07
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Forez Thomas
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 3
- Remerciements reçus 0
Je vous remercie pour vos réponses.
Je vais tester celà.
Bien à vous.
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Exporter résultats Cplex vers Excel via Powershell