Question
Modification d'une colonne d'un fichier CSV
- Clarisse
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
Je débute dans tout ce qui est script, et j'avoue avoir beaucoup de mal à saisir toutes les subtilités de cet... art
Je vous expose mon problème.
J'ai un fichier .csv (délimiteur \";\", colonnes entourées par des \"\").
J'ai plusieurs colonnes dans ce fichier. Ces colonnes sont remplies avec diverses informations plus ou moins intéressantes.
Dans une de ces colonnes, j'ai une trèèèèèèèès longue chaine de caractère, que je souhaite \"couper\", pour ne conserver qu'une chaine qui va du caractère 2 à 40.
Donc, en gros, ce que je veux, c'est modifier mon fichier CSV et l'enregistrer avec cette modification.
Et... je n'y arrive pas.
J'arrive à afficher dans mon éditeur de script le résultat du \"coupage\", mais pas à modifier le fichier.
Voila mon script pour le moment :
[code:1]$csv = 'C:\Users\user\Documents\folder\fichier.csv'
$csvfile = Import-csv $csv -Delimiter \";\"
#$i = 0
Foreach ($csvfile in $csvfile) {
$csvfile -replace $csvfile.colonne,($csvfile.colonne).Substring(2,40)
}
#out-file 'C:\Users\user\Documents\folder\fichier2.csv' -Encoding default -Append
#$csvfile | Export-Csv 'C:\Users\user\Documents\folder\fichier2.csv' -NoTypeInformation[/code:1]
Donc avec ça, j'affiche (merci Import-Csv) chaque ligne de mon fichier, avec la modification que je veux dans ma colonne \"colonne\".
J'avais essayé de remplacer \"Import-Csv\" par un Get-Content, qui n'a rien changé, j'avais essayé plusieurs choses, que malheureusement, je n'ai pas forcément gardé (mais vous pouvez avoir quelques exemples de choses essayées en commentaires).
Est-ce que quelqu'un a une solution pour moi ?
(ha, et il faudrait, dans l'idéal, que l'encodage du fichier (qui est en UTF16 je crois), ne soit pas modifié, vu que je le modifie moi-même grâce à un autre script
Après, si je peux faire d'une pierre deux coups... pourquoi pas)
Merci d'avance à ceux qui m'apporteront leur précieuse aide
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
tu a presque tous bon !
ta ligne suivante enregistre bien le fichier après modif :
[code:1]$csvfile | Export-Csv 'C:\Users\user\Documents\folder\fichier2.csv' -NoTypeInformation[/code:1]
mais ton probleme ce trouve là :
[code:1]Foreach ($csvfile in $csvfile) {
$csvfile -replace $csvfile.colonne,($csvfile.colonne).Substring(2,40)
}
[/code:1]
il y a deux erreurs :
1)
Foreach ($csvfile in $csvfile) : il te faut lire : pour chaque élément (premier paramètre) de cette objet (deuxième paramètre).
si tu traduit : je fait une boucle lire les éléments de l'objet dans la variable du deuxième paramètre, et donc je les met un par un dans la variable du premier paramètre !
et la tu t'aperçois que si les deux variables ont le même nom, tu a un problème !
2)
$csvfile -replace $csvfile.colonne,($csvfile.colonne).Substring(2,40) : je te refait pas la traduction mais au final cette ligne renvoie bien les bonne données MAIS comme tu le dis vers l'affichage pas dans l'objet $csvfile
dommage tu ne peut donc pas l'enregistré !!!
voila les causes de tes problèmes
Connexion ou Créer un compte pour participer à la conversation.
- Clarisse
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
Tout d'abord, merci pour ton aide.
Je me rends compte que je n'ai pas grand chose à modifier pour que tout (a priori) fonctionne.
Alors, pour ton premier point, j'ai compris ce que je devais modifier (et quand j'y repense, c'est logique d'ailleurs !) :
[code:1]Foreach ($line in $csvfile)[/code:1]
Ca me semble déjà plus cohérent.
Du coup, j'ai modifié mon Foreach comme ça :
[code:1] $line -replace $line.colonne,($line.colonne).Substring(2,40)[/code:1]
Puisqu'avec l'ancien code, je n'avais plus de résultat.
Et j'avoue ne pas comprendre le 2ème point. Enfin... je ne sais pas quoi ajouter pour dire à mon code d'envoyer la modif dans le fichier.
Il manque un truc dans le Foreach, ça me semble évident.
LE fameux truc qui dit \"quand t'as compris ce que je veux garder, tu l'envoies dans la bonne colonne et tu sauvegardes\"... mais quoi ?
Je suis en train de tester avec cette ligne
[code:1]$csvfile | Export-Csv 'C:\Users\user\Documents\folder\fichier2.csv' -NoTypeInformation[/code:1]
Dans le Foreach, mais.... ça m'étonnerait que ce soit ça.
En plus, c'est trèèèès long (j'ai 70000 lignes dans mon fichier !!)... bon, après, je fais des tests sur mon pc, et à terme, tout sera exécuté sur un serveur, donc ça devrait, j'imagine, être plus rapide... j'espère (si ce que je teste est la bonne solution, évidemment, lol)<br><br>Message édité par: Clarisse, à: 1/06/15 11:38
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
Du coup, j'ai modifié mon Foreach comme ça :
[code:1] $line -replace $line.colonne,($line.colonne).Substring(2,40)[/code:1]
Puisqu'avec l'ancien code, je n'avais plus de résultat.
Et j'avoue ne pas comprendre le 2ème point.
tu fait bien la modif mais tu ne l'enregistre pas la modif renvoyé dans $csvfile soit $line dans la boucle
elle est seulement renvoyé vers l'affichage
surtout pas ça : à chaque modif d'une ligne, tu enregistre tout le fichierJe suis en train de tester avec cette ligne
Code:
[code:1]$csvfile | Export-Csv 'C:\Users\user\Documents\folder\fichier2.csv' -NoTypeInformation[/code:1]
Dans le Foreach, mais.... ça m'étonnerait que ce soit ça.
Connexion ou Créer un compte pour participer à la conversation.
- Clarisse
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 5
- Remerciements reçus 0
Clarisse écrit:
Du coup, j'ai modifié mon Foreach comme ça :
[code:1] $line -replace $line.colonne,($line.colonne).Substring(2,40)[/code:1]
Puisqu'avec l'ancien code, je n'avais plus de résultat.
Et j'avoue ne pas comprendre le 2ème point.
tu fait bien la modif mais tu ne l'enregistre pas la modif renvoyé dans $csvfile soit $line dans la boucle
elle est seulement renvoyé vers l'affichage
C'est ce point là que je ne comprends/trouve pas...
Dois-je rajouter quelque chose dans ce genre là :
[code:1]$line -replace $line.colonne,($line.colonne).Substring(2,40) | $csvfile[/code:1]
surtout pas ça : à chaque modif d'une ligne, tu enregistre tout le fichierJe suis en train de tester avec cette ligne
Code:
[code:1]$csvfile | Export-Csv 'C:\Users\user\Documents\folder\fichier2.csv' -NoTypeInformation[/code:1]
Dans le Foreach, mais.... ça m'étonnerait que ce soit ça.
C'est ce que je me suis dit, mais sur le moment, c'est la seule solution que j'ai réussi à envisager
J'ai arrêté l'exécution du script, histoire d'aller voir le résultat (par curiosité)
constat : le contenu de la colonne que je souhaite modifier ne contient pas du tout ce que je veux
Ma colonne contient des valeurs comme ceci :
[code:1]2;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;xxx[...][/code:1]
Ce que je veux, c'est garder tout ce qu'il y a entre les \";\".
Or, dans mon fichier, je n'ai que le \"2\" avant le \";\"
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Clarisse écrit:
Ceci dit sans animosité, sais-tu expliquer le pourquoi de cet ajout ?Dois-je rajouter quelque chose dans ce genre là :
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Modification d'une colonne d'un fichier CSV