Question Import-csv, impossible de convertir en double

Plus d'informations
il y a 9 ans 3 mois #23155 par Steve
Bonsoir la communauté,

Je travaille actuellement sur un chouette petit script sensé faire un check de la taille d'une arborescence sur des FS.

Ce dernier doit fonctionner sur deux niveau ( grand-parent/parent/enfant), me trier du dossier le plus volumineux au plus petit et comme j'aime rajouter des choses, me faire le up ou son inverse en %.

Tout se passe pas mal et je suis bloqué pour un simple System.string ( je supporte plus ce Type ... )

Je récupère chaque résultat obtenu que je conserve dans un csv. A chaque lancement, le csv est importé et je peux récupérer les anciennes tailles de fichier pour les donner à manger à l'algo qui fait les moyennes.

Mais je me rends compte que cette dernière pose problème, je peux forcer la conversion en double rien n'y fait. La valeur reste toujours en system.String et cela ne marche pas du tout pour le calcul de mes moyennes.

Voici le code en question :

[code:1]

$oldArb = Import-Csv -Path C:\test\tabR.csv -Delimiter \";\"



# On check sur trois lvl (parent\child\greatChild)
$arb = gci -Path \\FS\k$\dossier1\*, \\FS\k$\dossier1\\*, \\FS\k$\dossier1\\*\*
$mArb = $arb | Measure-Object -Property length -sum #metriques de l arbo
# taille du repertoire calculee + deux chiffres apres virgulation
$taille = (\"{0:N2}\" -f (($mArb.sum)/1MB«»))



#$rep = $arb | where { $_.psiscontainer -eq 1 } # liste des dossiers.


$rep = $arb.directoryName | Sort-Object -Unique
$i = 0
$tab = @()
$tabFull = @()

foreach ($r in $rep) {
#echo $r ((((gci -path $r) | Measure-Object -property length -sum).sum)/1Mb)
$a = gci -path $r -recurse
$ma = $a| Measure-Object -property length -sum
$ta = (\"{0:N2}\" -f (($ma.sum)/1MB«»))
$obj = New-Object PsCustomobject
$obj | Add-Member -Name \"source\" -membertype NoteProperty -value $a.directoryName[0]
$obj | Add-Member -Name \"taille\" -membertype NoteProperty -value $ta
$obj | Add-Member -Name \"oldTaille\" -membertype NoteProperty -value $null
$obj | Add-Member -Name \"up\" -membertype NoteProperty -value $null
$obj | Add-Member -Name \"down\" -membertype NoteProperty -value $null
$obj | Add-Member -Name \"unite\" -membertype NoteProperty -value \" Mo\"

#write-host \"$($a.directoryName[0]) est de $($ta) Mo\"
$tab += $obj
}

if(Test-Path C:\test\tabR.csv){
$csv = Import-Csv -Path 'C:\test\tabR.csv' -Delimiter \";\"
foreach ($t in $tab){
foreach ($c in $csv){
if($t.source -eq $c.source){
$t.oldTaille = $c.taille
echo $t.source

if($t.taille -gt $c.taille)
{
$gain = (($t.taille - $c.taille)/$t.taille)*100
$t.up = $gain
Write-Host \"UP \" + $gain + \" tTaille \" + $t.taille + \"cTaille \" + $c.taille
}

elseif($t.taille -eq $c.taille){
$gain = 0
$t.up = $gain
$t.down = $gain
Write-Host \"NULL \"
}

elseif($t.taille -lt $c.taille){
$gain = (($t.taille - $c.taille)/$c.taille)*100
$t.down = $gain
Write-Host \"DOWN \" + $gain
}
}

}
$tabFull += $t
}
}
else
{
Write-Host \"Pas de fichier CSV a importer\"
}

$tab | Sort-Object {[double]$_.taille} -Descending | ft -AutoSize
$tab | Sort-Object {[double]$_.taille} -Descending | Export-Csv -path c:\test\tabR.csv -Delimiter \";\"


#$csv= Import-Csv -Delimiter \";\" -Path C:\test\hector.csv
#$oldArb = $csv.fullName
#$comp = Compare-Object $oldArb $tabRange

[/code:1]

La ligne qui pose problème est $t.taille ( c'est elle qui refuse la convertion)

J'ai cherché en vain sur le forum ( enfin j'espère avoir bien cherché sinon vraiment sorry). C'est une notion de base, j'en ai conscience mais impossible de trouver la solution<br><br>Message édité par: Anoskar, à: 9/02/17 17:12

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

Plus d'informations
il y a 9 ans 3 mois #23158 par xyz
Salut,
dans ce cas utilise get-type sur l'objet et la propriété pour savoir ce que tu manipules (cf. write-debug).
Utilise une variable typée temporaire pour déterminer si le cast est possible (donnée erronée ?).
Ou
[code:1]
[System.Convert]::ToDouble('1,2') #fr
#[System.Convert]::ToDouble('1.2') #us
[System.Convert]::ToDouble('1.2',[CultureInfo]::InvariantCulture)
[/code:1]

Si tu as un msg d'erreur, communique le nous.

Tutoriels PowerShell

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

Plus d'informations
il y a 9 ans 1 mois #23412 par Steve
Laurent Dardenne écrit:

Salut,
dans ce cas utilise get-type sur l'objet et la propriété pour savoir ce que tu manipules (cf. write-debug).
Utilise une variable typée temporaire pour déterminer si le cast est possible (donnée erronée ?).
Ou
[code:1]
[System.Convert]::ToDouble('1,2') #fr
#[System.Convert]::ToDouble('1.2') #us
[System.Convert]::ToDouble('1.2',[CultureInfo]::InvariantCulture)
[/code:1]

Si tu as un msg d'erreur, communique le nous.


Bonjour Laurent, merci beaucoup ! Ta solution m'a sauvé ! aucunes erreurs, la conversion est passée
Bonne journée :-)

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

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