Bonjour.

Je souhaite traiter un fichier qui est au format CSV et très volumineux (20 millions d'enregistrements, 48 champs, 4 Go).
Il faudrait :
- Supprimer des "colonnes".
- Remplacer des chaines de caractères.
- Enlever les quotes si besoin et remplacer les "," par des ";"
- Dans l'idéal, formater un champ numérique (afficher le nombre sur 9 caractères avec des zéros devant : '27' => '000000027')

J'ai essayé avec Python, le traitement me prend moins de 5 minutes
Mais c'est pour le travail, et au travail je n'ai (normalement) pas accès à Python
En fait, je n'ai accès qu'à Powershell (et JS, mais j'ai des légers doutes pour un traitement de ce genre)

J'ai trouvé un exemple sur le blog de Balladelli. Après adaptation j'ai donc cette commande qui conserve uniquement les champs souhaités :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Import-Csv MonGrosFichier.csv | Select champ1, champ2, champ5, champ6, champ24, champ42| Export-Csv MonPetitFichier.csv –NTI -Delimiter ';'
Il me reste ensuite à traiter les chaines de caractères, avec des .replace() (plus rapides que _replace, si j'ai bien suivi) sur un fichier plus petit (2 Go) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
(Get-Content $csvfile) | Foreach-Object {$_.replace('"', '').replace('true', '1').replace('false',0)}|Out-File $csvfile
Problèmes :
- la première étape me prend énormément de temps : 2 heures (calculé avec Measure-Command {})
- la deuxième étape est tellement gourmande ( 6 Go de RAM pour traiter un fichier qui en fait 2) que j'ai fini par tuer le processus
A titre indicatif, mon script Python me prend 5 minutes pour tout faire

Il y a moyen d'optimiser le traitement (éventuellement en passant par Get-Content pour la première étape, ou en faisant une lecture ligne à ligne) ? Ou de forcer l'utilisation de plusieurs threads/plus de mémoire ?
Ou je dois considérer que PS ne pourra pas mieux faire ?


PS :
Quand je parle de Python, ce n'est pas pour dire que PS est mauvais c'est juste pour avoir un point de comparaison : l'ordinateur est capable de faire le traitement demandé en 5 minutes. S'il n'y arrive pas, c'est soit que PS n'est pas adapté pour ce genre de traitement, soit que les commandes ne sont pas bonnes...