Question Exporter résultats Cplex vers Excel via Powershell

Plus d'informations
il y a 11 ans 10 mois #17443 par Forez Thomas
Bonjour à tous,

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.

Plus d'informations
il y a 11 ans 10 mois #17446 par Laurent Dardenne
Salut,
Tfo89 écrit:

J'ai essayé simplement de remplacer le .log par .csv mais cela enregistre tous mes résultats dans la première colonne.

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.

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.

Plus d'informations
il y a 11 ans 10 mois #17447 par Forez Thomas
Bonjour et merci pour votre réponse.

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.

Plus d'informations
il y a 11 ans 10 mois #17448 par Laurent Dardenne
Tfo89 écrit:

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.

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.

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.

Plus d'informations
il y a 11 ans 10 mois #17451 par Laurent Dardenne
Ici seul le champ 'flows' pose pb, voici une ébauche :
[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.

Plus d'informations
il y a 11 ans 10 mois #17452 par Forez Thomas
Bonsoir,

Je vous remercie pour vos réponses.
Je vais tester celà.

Bien à vous.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.052 secondes
Propulsé par Kunena