Page 1 sur 1

[R] Dernière ligne d'un fichier : Vide ou pas ?

Posté : mer. 03 janv. 2018 11:40
par Jerem
Bonjour à tous,

Je me retrouve devant un problème plus compliquer à résoudre que je ne l'avais imaginé.

J'ai besoin de savoir si un fichier se termine par un saut de ligne ou non.
En théorie c'est assez simple, il suffit de vérifier si la dernière ligne est vide ou non. En pratique, s'il n'y a qu'un seul saut de ligne à la fin du fichier je trouve toujours que la dernière ligne n'est pas vide, alors qu'elle l'est.

Par exemple, je trouve le même résultat que mon fichier contienne ceci :

"Ligne 1
Ligne 2
Ligne 3"


Ou ceci :

"Ligne 1
Ligne 2
Ligne 3
"


La différence est subtile, mais quand on fait un writeline en fin de fichier la différence est notable. Dans un cas tout est sur la même ligne dans l'autre sur 2 lignes différentes et ça change tout.

Dans les deux exemples ci-dessus un FileReadLine ("monfichier.txt", -1) retourne "Ligne 3". Et ce n'est pas cool.
Avec un saut de ligne supplémentaire cela n'est plus vrai.
Ma version d'AutoIT est 3.3.15.0 (Beta).

J'ai essayer d'autres méthodes sans succès. Quelqu'un aurait une idée ?

Re: Dernière ligne d'un fichier : Vide ou pas ?

Posté : mer. 03 janv. 2018 11:57
par jchd
Avec un FileRead et ça :

Code : Tout sélectionner

Local $s = "a" & @CRLF & "b" & @CRLF & "c" & @CRLF & "d"

ConsoleWrite(_FinalEmpty($s) & @LF)
$s &= @CRLF
ConsoleWrite(_FinalEmpty($s) & @LF)

Func _FinalEmpty($st)
	Return StringRegExp($st, "\R$")
EndFunc

Re: Dernière ligne d'un fichier : Vide ou pas ?

Posté : mer. 03 janv. 2018 14:36
par sylvanie
Bonjour, si on ne souhaite pas mémoriser l'ensemble du contenu du fichier, on peut l'ouvrir en mode binaire et se positionner sur le dernier caractère.
Puis on lit le dernier octet, si il y a un retours chariot DOS ou Unix, ce caractère vaut 0x0a :

Code : Tout sélectionner

#include <Constants.au3>

$Document=@DesktopDir&"\tst_CRLF.txt"
$hnd=FileOpen($Document,16)
If $hnd=-1 Then exit 1
FileSetPos($hnd,-1,$FILE_END)
$ENDCHAR=FileRead($hnd,1)
$MESSAGE="Return not detected"
If $ENDCHAR="0x0a" Then $MESSAGE="Return detected"
ConsoleWrite($MESSAGE&@CRLF)
Exit 0


Re: Dernière ligne d'un fichier : Vide ou pas ?

Posté : mer. 03 janv. 2018 14:52
par Jerem
Peut-être que je me trompe, mais je suppose qu'un fileread est plus gourmand en temps et en ressource qu'un filereadline.
Ça semblerait logique, sauf si le file readline parcourt tout le fichier pour arriver à la dernière ligne et la lire.

Mais si je me trompe alors la première proposition est bonne. J'étais tellement obnubilé par cette dernière ligne que j'en ai oublié que le fichier complet contient forcément tous les caractères du fichier.

La proposition du mode binaire est aussi très intéressante et se rapproche beaucoup de mon idée de base, sauf que cela devrait fonctionner.
Je vais tester cela.

Merci à vous 2.

Re: Dernière ligne d'un fichier : Vide ou pas ?

Posté : mer. 03 janv. 2018 15:06
par Jerem
Le mode binaire n'est pas nécessaire, ce qui m'arrange car le fichier est déjà ouvert en lecture avant que je fasse mon test pour les besoin de mon programme.

En adaptant (un tout petit peu) la solution précédente cela donne :

$Document=@DesktopDir&"\tst_CRLF.txt"
$hnd=FileOpen($Document)
If $hnd=-1 Then exit 1
FileSetPos($hnd,-2,$FILE_END)
$ENDCHAR=FileRead($hnd,2)
$MESSAGE="Return not detected"
If $ENDCHAR==@CRLF Then $MESSAGE="Return detected"
ConsoleWrite($MESSAGE&@CRLF)
Exit 0

Simple et efficace. Merci Sylvanie.