Question Modification d'une colonne d'un fichier CSV

Plus d'informations
il y a 10 ans 9 mois #19806 par Clarisse
Bonjour à tous.

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.

Plus d'informations
il y a 10 ans 9 mois #19808 par Philippe
salut Clarisse

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 :evil:

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

Plus d'informations
il y a 10 ans 9 mois #19809 par Clarisse
Bonjour 6ratgus.

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.

Plus d'informations
il y a 10 ans 9 mois #19811 par Philippe
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

Je 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.

surtout pas ça : à chaque modif d'une ligne, tu enregistre tout le fichier

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

Plus d'informations
il y a 10 ans 9 mois #19812 par Clarisse
6ratgus écrit:

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]

Je 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.

surtout pas ça : à chaque modif d'une ligne, tu enregistre tout le fichier


C'est ce que je me suis dit, mais sur le moment, c'est la seule solution que j'ai réussi à envisager :dry:

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 :angry:

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 \&quot;;\&quot;.
Or, dans mon fichier, je n'ai que le \&quot;2\&quot; avant le \&quot;;\&quot; :silly:

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

Plus d'informations
il y a 10 ans 9 mois #19813 par Laurent Dardenne
Salut,
Clarisse écrit:

Dois-je rajouter quelque chose dans ce genre là :

Ceci dit sans animosité, sais-tu expliquer le pourquoi de cet ajout ?

Tutoriels PowerShell

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

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