Question
Import-csv, impossible de convertir en double
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 9 ans 3 mois #23155
par Steve
Import-csv, impossible de convertir en double a été créé 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
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.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 9 ans 3 mois #23158
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Import-csv, impossible de convertir en double
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.
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.
- Steve
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 22
- Remerciements reçus 0
il y a 9 ans 1 mois #23412
par Steve
Réponse de Steve sur le sujet Re:Import-csv, impossible de convertir en double
Laurent Dardenne écrit:
Bonjour Laurent, merci beaucoup ! Ta solution m'a sauvé ! aucunes erreurs, la conversion est passée
Bonne journée
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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Import-csv, impossible de convertir en double