Question Suppression du \"CR\" \"LF\" à la fin d'un fichier
- arnau
-
Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 11
- Remerciements reçus 0
il y a 14 ans 4 mois #10548
par arnau
Bonjour à tous,
Tout d'abord je vous remercie pour ce super forum qui m'a toujours été très utile pour faire tous mes scripts powershell et qui me fait découvrir tous les jours de nouvelles fonctionnalités bien intéressantes à exploiter.
Malgré une certaine autonomie gagnée grâce à ce site, je bute actuellement sur un problème qui commence sérieusement à me ronger. C'est pourquoi j'aurais besoin de votre aide (en sachant pertinemment que d'autres sont ou seront intéressés):
J'ai un fichier texte (enfin csv mais je le traite comme du texte au niveau de mon script) qui est généré par mon script. A partir de ce fichier je dois en généré un nouveau qui aura un nom different, un emplacement different, la première ligne dégagée et je dois faire sauter le dernier CR LF rajouter par le format texte si on peut dire . Et c'est sur ce dernier point que je bute, pour l'instant j'ai :
[code:1]Get-Content \".\test.csv\" | select-string . | where {$_.linenumber -ne 1} | set-content \".\folder\test2.csv\"[/code:1]
Seulement à la fin du fichier généré il a fait comme un retour chariot nouvelle ligne que j'aimerais ne pas avoir. (Je dis \"il a fait comme\" car quand on utilise le measure-object -Line il ne voit pas cette fameuse nouvelle ligne)
J'ai essayé de rajouter [code:1] `b [/code:1] à la fin de mon fichier pour le supprimer mais il le fait avant de rajouter le CR LF donc inutile.
Si quelqu'un à une idée, ou besoin d'un complément d'infos, tenez moi au courant.
Merci d'avance
Tout d'abord je vous remercie pour ce super forum qui m'a toujours été très utile pour faire tous mes scripts powershell et qui me fait découvrir tous les jours de nouvelles fonctionnalités bien intéressantes à exploiter.
Malgré une certaine autonomie gagnée grâce à ce site, je bute actuellement sur un problème qui commence sérieusement à me ronger. C'est pourquoi j'aurais besoin de votre aide (en sachant pertinemment que d'autres sont ou seront intéressés):
J'ai un fichier texte (enfin csv mais je le traite comme du texte au niveau de mon script) qui est généré par mon script. A partir de ce fichier je dois en généré un nouveau qui aura un nom different, un emplacement different, la première ligne dégagée et je dois faire sauter le dernier CR LF rajouter par le format texte si on peut dire . Et c'est sur ce dernier point que je bute, pour l'instant j'ai :
[code:1]Get-Content \".\test.csv\" | select-string . | where {$_.linenumber -ne 1} | set-content \".\folder\test2.csv\"[/code:1]
Seulement à la fin du fichier généré il a fait comme un retour chariot nouvelle ligne que j'aimerais ne pas avoir. (Je dis \"il a fait comme\" car quand on utilise le measure-object -Line il ne voit pas cette fameuse nouvelle ligne)
J'ai essayé de rajouter [code:1] `b [/code:1] à la fin de mon fichier pour le supprimer mais il le fait avant de rajouter le CR LF donc inutile.
Si quelqu'un à une idée, ou besoin d'un complément d'infos, tenez moi au courant.
Merci d'avance
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 14 ans 4 mois #10553
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Suppression du
maar écrit:
Mais je n'ai pas de solution pour le moment
Voir ce post .Si quelqu'un à une idée, ou besoin d'un complément d'infos, tenez moi au courant.
Mais je n'ai pas de solution pour le moment
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- arnau
-
Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 11
- Remerciements reçus 0
il y a 14 ans 4 mois #10559
par arnau
Réponse de arnau sur le sujet Re:Suppression du
D'accord merci.
Le post illustre bien le souci en effet, il montre bien qu'à la chaine est rajouté 0D (CR) et 0A (LF) et qu'avec une certaine manipulation il n'y sont plus.
Je vais voir si j'arrive à exploiter cette technique dans mon cas mais j'ai un doute : je veux faire sauter uniquement le dernier CRLF, pas tous les précédents.
Je me demandais si il y avait pas une technique pour ouvrir un fichier, déplacer le pointeur à la fin, faire un backspace et un save. (Peut être qu'une classe File a toute ces petites méthodes?)
Le post illustre bien le souci en effet, il montre bien qu'à la chaine est rajouté 0D (CR) et 0A (LF) et qu'avec une certaine manipulation il n'y sont plus.
Je vais voir si j'arrive à exploiter cette technique dans mon cas mais j'ai un doute : je veux faire sauter uniquement le dernier CRLF, pas tous les précédents.
Je me demandais si il y avait pas une technique pour ouvrir un fichier, déplacer le pointeur à la fin, faire un backspace et un save. (Peut être qu'une classe File a toute ces petites méthodes?)
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 14 ans 4 mois #10560
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Suppression du
Tout comptes fait le post cité, soulève le pb, mais ne le résoud pas.
De suivre la piste de l'encodage n'est peut être pas le plus simple.
Donc après qq essais infructueux, je suis revenu à une solution plus classique.
Et cela faisait longtemps que je n'avais pas regretté un langage de bas niveau !
Bref, une ébauche de solution :
[code:1]
$file1=\"c:\temp\test.csv\"
$file2=\"c:\temp\test2.csv\"
@\"
un
deux
trois
\"@ > $File1
Remove-Item $File2 -force -EA SilentlyContinue
Copy-Item $file1 $file2
#from www.eggheadcafe.com/microsoft/Powershell...tent-appends-rn.aspx
$fs = [IO.File]::OpenWrite($File2)
$fs.setlength($fs.length-4)
$fs.close()
[/code:1]
La solution est tout simplement de traiter le fichier comme un tableau de bytes auquel on retranche le CRLF.
Comme tu le constatais :
maar écrit:
Je parle d'une ébauche, car entre le post d'origine et celui-ci, la longueur à retrancher double.
Il est fort probable qu'il faille traiter le BOM
A suivre
PowerAcétyl -sali -cylique
De suivre la piste de l'encodage n'est peut être pas le plus simple.
Donc après qq essais infructueux, je suis revenu à une solution plus classique.
Et cela faisait longtemps que je n'avais pas regretté un langage de bas niveau !
Bref, une ébauche de solution :
[code:1]
$file1=\"c:\temp\test.csv\"
$file2=\"c:\temp\test2.csv\"
@\"
un
deux
trois
\"@ > $File1
Remove-Item $File2 -force -EA SilentlyContinue
Copy-Item $file1 $file2
#from www.eggheadcafe.com/microsoft/Powershell...tent-appends-rn.aspx
$fs = [IO.File]::OpenWrite($File2)
$fs.setlength($fs.length-4)
$fs.close()
[/code:1]
La solution est tout simplement de traiter le fichier comme un tableau de bytes auquel on retranche le CRLF.
Comme tu le constatais :
maar écrit:
Je me demandais si il y avait pas une technique pour ouvrir un fichier, déplacer le pointeur à la fin, faire un backspace et un save.
Je parle d'une ébauche, car entre le post d'origine et celui-ci, la longueur à retrancher double.
Il est fort probable qu'il faille traiter le BOM
A suivre
PowerAcétyl -sali -cylique
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- arnau
-
Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 11
- Remerciements reçus 0
il y a 14 ans 4 mois #10565
par arnau
Réponse de arnau sur le sujet Re:Suppression du
En effet, ta technique marche bien.
Pour la longueur à retrancher, c'est normal qu'elle soit de 4 dans ton exemple si tu le traites comme un tableau de bytes (octets) car CR LF = 0d 0a = 4 x 8bits ou 4 octets (ou bytes).
Cela fait drôle en effet de revenir au bas niveau mais la preuve que c'est toujours nécessaire de revenir à ça.
J'ai maintenant un fichier généré correctement, mais ce fichier sera appelé par la suite par un autre script, c'est là que je pourrais valider le fonctionnement à 100%.
Merci à toi en tout cas Laurent
Pour la longueur à retrancher, c'est normal qu'elle soit de 4 dans ton exemple si tu le traites comme un tableau de bytes (octets) car CR LF = 0d 0a = 4 x 8bits ou 4 octets (ou bytes).
Cela fait drôle en effet de revenir au bas niveau mais la preuve que c'est toujours nécessaire de revenir à ça.
J'ai maintenant un fichier généré correctement, mais ce fichier sera appelé par la suite par un autre script, c'est là que je pourrais valider le fonctionnement à 100%.
Merci à toi en tout cas Laurent
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.095 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Suppression du "CR" "LF" à la fin d'un fichier