Question resultat \"split\" bizarre

Plus d'informations
il y a 12 ans 10 mois #14705 par Romain F.
Bonjour tout le monde,

J'ai fait une fonction split sur un fichier txt
mais le résultat obtenue n'est pas comme je le souhaiterais ...

Mon code est le suivant :
[code:1]$CSV = Import-Csv -Path \".\Resultats.csv\" -delimiter \",\"

foreach ($line in $CSV)
{
$line
$split = $line -split ','

for ($i=0 ;$i –le ($split.Length) ;$i++)
{
Write-output $split[$i]>> \".\Resultats2.txt\"
}
}
[/code:1]


mais mon fichier de sortie apparrait commme ca :
[code:1]@{172.19.XXX.XX
Teleste
MPH101
\"3.0.22\"
HK00XXXXXX
\"2.0\"
\"CD-0029\"=172.19.XXX.XX



HK00XXXXXX




P2
VE2
\"Encoder 2 - H.264\"
H_264
=12/1
CBR
1800
100.0
3




232.19.XX.XX
5008
true}
@{172.19.XXX.XX
Teleste
MPH101
\"3.0.22\"
HK00XXXXX
\"2.0\"
\"CD-0029\"=172.19.XXX.XX
Teleste
MPH101
\"3.0.22\"
HK00XXXXX
\"2.0\"
\"CD-0030\"}[/code:1]

Ce qui me dérange c'est le \"@{172.19.XXX.XX\" et \"}\" qui apparait au début et à la fin de chaque, est il possible de changer ca ?

surtout que le \"@{172.19.XXX.XX\" est le meme pour TOUTE les lignes , alors que dans mon fichier cela change au fur et a mesure ...

Mon programme prend t il cette première ligne comme un header .

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

Plus d'informations
il y a 12 ans 10 mois #14706 par darphboubou
j'ai déjà eu ce genre de souci, si je me souviens bien j'avais associé une variable à ma variable

en gros

[code:1]

$line1=$line

$split = $line1 -split ','

[/code:1]

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

Plus d'informations
il y a 12 ans 10 mois #14707 par Romain F.
Non ca ne fonctionne pas ...

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

Plus d'informations
il y a 12 ans 10 mois #14708 par SiSMik
Si c'est toujours le même csv que l'autre jour, merci déjà de rester sur le même poste.

En plus de ça, je viens de comprendre ton problème. Tout est dans le fait que ton csv est foireux. en gros chaque ligne ne contient pas le même nombre de champs.

du coup, pour traiter chaque ligne, il va falloir que tu fasses, un get-content de ton fichier ave cun foreach sur chaque ligne comme tu veux le faire.

Par contre, tu vas galérer vu que chaque ligne de contiendra pas le même nombre de champs.

Amuses toi bien.

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

Plus d'informations
il y a 12 ans 10 mois #14709 par Matthew BETTON
Bonjour,

[code:1]
$CSV = Import-Csv -Path \".\Resultats.csv\" -delimiter \",\"
[/code:1]

Tu n'as pas besoin d'utiliser le paramétre '-delimiter' car le séparateur par défaut se trouve être justement ... la virgule ;)

[code:1]
PS>Get-Help import-csv

NOM
Import-CSV

RÉSUMÉ
Convertit les propriétés d'objet d'un fichier CSV (fichier de valeurs séparées par des virgules) en versions CSV de
s objets d'origine.

[/code:1]

Ici tu importes un fichier CSV et tu récupères donc, dans la variable $CSV, un tableau d'objets personnalisés (PSCustomObject).

Exemple avec un fichier csv tel que :

A,B,C,D
valeur1,valeur2,valeur3,valeur4
valeur11,valeur12,valeur13,valeur14
valeur21,valeur22,valeur23,valeur24


[code:1]
PS> $CSV = Import-Csv -Path \".\Resultats.csv\"
PS>$csv

A B C D
- - - -
valeur1 valeur2 valeur3 valeur4
valeur11 valeur12 valeur13 valeur14
valeur21 valeur22 valeur23 valeur24

PS> $CSV | Get-Member


TypeName: System.Management.Automation.PSCustomObject

Name MemberType Definition
----

Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
A NoteProperty System.String A=valeur1
B NoteProperty System.String B=valeur2
C NoteProperty System.String C=valeur3
D NoteProperty System.String D=valeur4

[/code:1]

Chaque nom de colonne représente une 'NoteProperty' de chaque Objet, sachant que l'on récupère un objet personnalisé par ligne ... La 'définition' correspond à la valeur de la propriété concernée.

Du coup, je ne comprends pas l'histoire du 'split' sur la virgule : après le 'Import-Csv', il n'est plus question de ',' :)

Essayes plutôt :

[code:1]
$CSV = Get-Content .\Resultats.csv
[/code:1]

Dans ce cas, le foreach va te renvoyer chaque ligne du fichier (une chaine de caractères) que tu vas pouvoir ensuite traiter avec ton split.

Sinon, avec un 'Import-Csv', en considérant que ton fichier csv est bien un fichier csv digne de ce nom et qu'il contient donc un Header (des noms de colonne) :

[code:1]
$CSV = Import-Csv .\Resultats.csv

# On récupère les noms de colonne => les noms des propriétés (NoteProperty) de chaque objet
$NoteProperties = $CSV | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name

# On traite chaque objet récupéré via le Import-Csv
foreach ($obj in $CSV)
{
# Pour chaque propriété d'objet
Foreach($NoteProperty in $NoteProperties){
# On ajoute la valeur de la propriét de l'objet en cours dans le fichier texte
Write-output $obj.\"$Noteproperty\" | Out-File \".\Resultats2.txt\" -Append
}
}
[/code:1]

Si ton fichier ne contient pas de Header, tu peux en spécifier un via le paramètre '-Header' sur 'Import-Csv' :

[code:1]
$CSV = Import-Csv .\Resultats.csv -Header A,B,C,D
[/code:1]

@+

Matthew BETTON

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

Plus d'informations
il y a 12 ans 10 mois #14710 par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:resultat
benduru écrit:

Si c'est toujours le même csv que l'autre jour, merci déjà de rester sur le même poste.

En plus de ça, je viens de comprendre ton problème. Tout est dans le fait que ton csv est foireux. en gros chaque ligne ne contient pas le même nombre de champs.

du coup, pour traiter chaque ligne, il va falloir que tu fasses, un get-content de ton fichier ave cun foreach sur chaque ligne comme tu veux le faire.

Par contre, tu vas galérer vu que chaque ligne de contiendra pas le même nombre de champs.

Amuses toi bien.


Salut Fab,

Encore la fête à la saucisse ;)

Je sais, c'est moi la saucisse :laugh:

@ ++

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

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