Question
Découper fichier texte trop long (+65335 lignes)
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 17 ans 1 mois #3890
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Découper fichier texte
Je n'ai pas de très gros fichier pour tester les perfs, mais voici une solution un peu simplifiée qui utilise la logique du paramètre -readcount pour découper le fichier à la taille voulue :
[code:1]
param ($filename,$size)
$file = get-item $filename -ea Stop
$basename = $file.fullname -replace \"$($file.extension)$\"
$extension = $file.extension
$index = 0
get-content -readcount $size $file | foreach {
$_ | out-file (\"{0}_{1:d3}{2}\" -f $basename,$index++,$extension)
}
[/code:1]
Sinon, comme déjà indiqué par Laurent, il faut bien lire le fichier pour avoir le nombre de lignes.
Si les perfs sont un vrai problème, on peut aussi utiliser les méthodes de la classe System.IO.StreamReader à la place de get-content. L'accès direct aux classes .NET est en général plus performant que les commandelettes (qui, elles, offrent plus de souplesse et gèrent plus d'informations).
Janel
[code:1]
param ($filename,$size)
$file = get-item $filename -ea Stop
$basename = $file.fullname -replace \"$($file.extension)$\"
$extension = $file.extension
$index = 0
get-content -readcount $size $file | foreach {
$_ | out-file (\"{0}_{1:d3}{2}\" -f $basename,$index++,$extension)
}
[/code:1]
Sinon, comme déjà indiqué par Laurent, il faut bien lire le fichier pour avoir le nombre de lignes.
Si les perfs sont un vrai problème, on peut aussi utiliser les méthodes de la classe System.IO.StreamReader à la place de get-content. L'accès direct aux classes .NET est en général plus performant que les commandelettes (qui, elles, offrent plus de souplesse et gèrent plus d'informations).
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 17 ans 1 mois #3896
par Bredin Samuel
Réponse de Bredin Samuel sur le sujet Re:Découper fichier texte
Bonjour,
J'ai posé cette question pour positionner un nombre de chiffre adéquate afin d'obtenir un classement alphabétique correct.
Ex:
Si que 9 fichiers ==> d1
nom_fichier1.csv
nom_fichier2.csv
...
nom_fichier9.csv
Si que 40 fichiers ==> d2
nom_fichier01.csv
nom_fichier02.csv
...
nom_fichier40.csv
Je ne voudrais pas :
nom_fichier001.csv
nom_fichier002.csv
...
nom_fichier999.csv
nom_fichier1000.csv
Par ordre alphabétique le dernier fichier ci-dessus sera en premier.
Merci Jamel pour cette proposition.
Je teste et fait un retour.
J'ai posé cette question pour positionner un nombre de chiffre adéquate afin d'obtenir un classement alphabétique correct.
Ex:
Si que 9 fichiers ==> d1
nom_fichier1.csv
nom_fichier2.csv
...
nom_fichier9.csv
Si que 40 fichiers ==> d2
nom_fichier01.csv
nom_fichier02.csv
...
nom_fichier40.csv
Je ne voudrais pas :
nom_fichier001.csv
nom_fichier002.csv
...
nom_fichier999.csv
nom_fichier1000.csv
Par ordre alphabétique le dernier fichier ci-dessus sera en premier.
Merci Jamel pour cette proposition.
Je teste et fait un retour.
Connexion ou Créer un compte pour participer à la conversation.
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 17 ans 1 mois #3897
par Bredin Samuel
Réponse de Bredin Samuel sur le sujet Re:Découper fichier texte
Jamel,
Je viens de tester ta fonction.
Encore mieux, accessoirement consome deux fois moins de mémoire vive et par contre encore plus rapide.
Ma fonction d'origine 1h et 17 min. (mém. environ 150 Mo)
La fonction de Laurent 3 min 52 sec. (mém. environ 150 Mo)
La fonction de Jamel 2 min 57 (mém. environ 80 Mo).
Je précise que tous ces tests ont été réalisé avec le même fichier et sur la même machine.
Un fichier de 214 Mo.
Si je veux préciser le \"d3\", est ce que je suis obligé d'exécuter 2 Get-Content ?
Jamel, je ne comprend pas le [code:1]\"$($file.extension)$\"[/code:1]
Pourquoi le dernier $ ?
Un grand merci à vous.
Je viens de tester ta fonction.
Encore mieux, accessoirement consome deux fois moins de mémoire vive et par contre encore plus rapide.
Ma fonction d'origine 1h et 17 min. (mém. environ 150 Mo)
La fonction de Laurent 3 min 52 sec. (mém. environ 150 Mo)
La fonction de Jamel 2 min 57 (mém. environ 80 Mo).
Je précise que tous ces tests ont été réalisé avec le même fichier et sur la même machine.
Un fichier de 214 Mo.
Si je veux préciser le \"d3\", est ce que je suis obligé d'exécuter 2 Get-Content ?
Jamel, je ne comprend pas le [code:1]\"$($file.extension)$\"[/code:1]
Pourquoi le dernier $ ?
Un grand merci à vous.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 1 mois #3899
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Découper fichier texte
Mephisto écrit:
[code:1]
# Arrondi le résultat de la division au chiffre supérieure. Pour 100 lignes le résultat=1, pour 101=2
$nbFile= [math]::Ceiling((gc $File).count /100)
[/code:1]
Mephisto écrit:
C'est une expression régulière qui indique que la recherche de l'occurence précisée par l'extension doit se trouver en fin de chaîne uniquement. Si le fichier contient + occurences de l'extension on ne modifie que la dernière, ex:
[code:1]Nom.executable.exe
#replace .exe -> .txt
# renvoi Nom.txtecutable.txt
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 3/02/09 13:35
Oui j'ai bien peur :Si je veux préciser le \"d3\", est ce que je suis obligé d'exécuter 2 Get-Content ?
[code:1]
# Arrondi le résultat de la division au chiffre supérieure. Pour 100 lignes le résultat=1, pour 101=2
$nbFile= [math]::Ceiling((gc $File).count /100)
[/code:1]
Mephisto écrit:
Je me permets de répondre.Pourquoi le dernier $ ?
C'est une expression régulière qui indique que la recherche de l'occurence précisée par l'extension doit se trouver en fin de chaîne uniquement. Si le fichier contient + occurences de l'extension on ne modifie que la dernière, ex:
[code:1]Nom.executable.exe
#replace .exe -> .txt
# renvoi Nom.txtecutable.txt
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 3/02/09 13:35
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 17 ans 1 mois #3900
par Bredin Samuel
Réponse de Bredin Samuel sur le sujet Re:Découper fichier texte
Merci pour tout Laurent.
Pour le $, je n'ai même pas fait le rapprochement avec les expressions régulières (j'aurai du).
Bonne journée.
Pour le $, je n'ai même pas fait le rapprochement avec les expressions régulières (j'aurai du).
Bonne journée.
Connexion ou Créer un compte pour participer à la conversation.
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 17 ans 1 mois #3906
par Bredin Samuel
Réponse de Bredin Samuel sur le sujet Re:Découper fichier texte
Re bonjour,
Je viens de faire une petite découverte.
Si ça intéresse des gens.
Toujours avec un fichier texte de 214 Mo.
Première commande :
[code:1](gc 'C:\Local\Test\Fichier.txt').Count[/code:1]
Donne le nombre de ligne en 43 sec.
Deuxième commande :
[code:1]([System.IO.File]::ReadAllLines('C:\Local\Test\Fichier.txt')).Count[/code:1]
Donne le nombre de ligne en 4 sec. (beaucoup plus raisonnable)
Je viens de faire une petite découverte.
Si ça intéresse des gens.
Toujours avec un fichier texte de 214 Mo.
Première commande :
[code:1](gc 'C:\Local\Test\Fichier.txt').Count[/code:1]
Donne le nombre de ligne en 43 sec.
Deuxième commande :
[code:1]([System.IO.File]::ReadAllLines('C:\Local\Test\Fichier.txt')).Count[/code:1]
Donne le nombre de ligne en 4 sec. (beaucoup plus raisonnable)
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.111 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Découper fichier texte trop long (+65335 lignes)