re-inventer la roue ?

Le
kurtz le pirate
bonjour,

n'ayant rien trouvé sur le web et ayant besoin de déterminer l'os
d'origine d'un fichier pour déterminer le(s) caractère(s) de fin de
ligne, j'ai écrit ce petit bout de code :

#!/usr/bin/perl -w
use strict;
use IO::File;

sub FindOS {
my $thisFile = shift;
my $thisChar;
my $LineFeedCount=0;
my $CarriageReturnCount=0;
my @results;
my $fileHandle = new IO::File;
if ($fileHandle->open($thisFile,"r")) {
while (!eof($fileHandle)) {
$thisChar=getc($fileHandle);
if ($thisChar =~ /x0a/) { $LineFeedCount++; }
if ($thisChar =~ /x0d/) { $CarriageReturnCount++; }
}
$fileHandle->close;
if
(($CarriageReturnCount>0)&&($LineFeedCount==$CarriageReturnCount)) {
push @results,"0";
push @results,"Dos";
}
elsif (($LineFeedCount>0)&&($CarriageReturnCount==0)) {
push @results,"0";
push @results,"Unix";
}
elsif (($CarriageReturnCount>0)&&($LineFeedCount==0)) {
push @results,"0";
push @results,"Mac";
}
else {
push @results,"0";
push @results,"Inconnu";
}
}
else {
push @results,"-1";
push @results,$!;
}
return @results;
}


que l'on peut utiliser comme ça :

$fileName = "le_nom_du_fichier_a_tester";
($error,$os) = FindOS($fileName);
if ($error==0) {
print "Le fichier '$fileName' est un fichier $os.";
}
else {
print "Erreur pour le fichier '$fileName' : $os !";
}


vous en pensez quoi ?

le truc qui me gène, c'est de lire tout le fichier mais je ne vois pas
comment faire pour choisir arbitrairement le nombre de caractères lus
pour que les décomptes des cr/lf soient représentatifs.


--
klp
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrick Texier
Le #141599
Le Mon, 02 Apr 2007 17:16:50 +0200, kurtz le pirate a écrit :

vous en pensez quoi ?

le truc qui me gène, c'est de lire tout le fichier mais je ne vois pas
comment faire pour choisir arbitrairement le nombre de caractères lus
pour que les décomptes des cr/lf soient représentatifs.


Il va reconnaître des fichiers Windows au premier cr trouvé dans un
fichier Unix. J'en trouve en temps en temps dans les sources de
LifeLines.

Il faudrait compter le terminateur le plus fréquent.

Klaus
Le #141595
On Apr 2, 5:16 pm, kurtz le pirate
bonjour,

n'ayant rien trouvé sur le web et ayant besoin de déterminer l'os
d'origine d'un fichier pour déterminer le(s) caractère(s) de fin de
ligne, j'ai écrit ce petit bout de code :

#!/usr/bin/perl -w
use strict;
use IO::File;

sub FindOS {
my $thisFile = shift;
my $thisChar;
my $LineFeedCount=0;
my $CarriageReturnCount=0;
my @results;
my $fileHandle = new IO::File;
if ($fileHandle->open($thisFile,"r")) {
while (!eof($fileHandle)) {
$thisChar=getc($fileHandle);
if ($thisChar =~ /x0a/) { $LineFeedCount++; }
if ($thisChar =~ /x0d/) { $CarriageReturnCount++; }
}
$fileHandle->close;
if
(($CarriageReturnCount>0)&&($LineFeedCount==$CarriageReturnCount)) {
push @results,"0";
push @results,"Dos";
}
elsif (($LineFeedCount>0)&&($CarriageReturnCount==0)) {
push @results,"0";
push @results,"Unix";
}
elsif (($CarriageReturnCount>0)&&($LineFeedCount==0)) {
push @results,"0";
push @results,"Mac";
}
else {
push @results,"0";
push @results,"Inconnu";
}
}
else {
push @results,"-1";
push @results,$!;
}
return @results;
}

... que l'on peut utiliser comme ça :

$fileName = "le_nom_du_fichier_a_tester";
($error,$os) = FindOS($fileName);
if ($error==0) {
print "Le fichier '$fileName' est un fichier $os.n";
}
else {
print "Erreur pour le fichier '$fileName' : $os !n";
}

vous en pensez quoi ?


Je pense à "TIMTOWTDI".

Voici ma façon de faire la même chose:

========================= ====
use strict;
use warnings;

my $fn = 'test.dat';
print "FindOS('$fn') = ", FindOS($fn), "n";

sub FindOS {
my $file = shift;
my ($LF_Count, $CR_Count) = (0, 0);

open my $fh, '<', $file or return -1, $!;
binmode $fh or return -1, $!;
local $/ = 32768; # read file in chunks of 32K at a time
local $_;
while (<$fh>) {
$LF_Count += () = /x0a/g;
$CR_Count += () = /x0d/g;
}
close $fh;

if ($CR_Count > 0 and $LF_Count == $CR_Count) { return 0,
'Dos' }
if ($CR_Count == 0 and $LF_Count > 0 ) { return 0,
'Unix' }
if ($CR_Count > 0 and $LF_Count == 0 ) { return 0,
'Mac' }
return 0, 'Inconnu';
}
========================= ====

--
Klaus

kurtz_le_pirate
Le #143896
"Klaus"
On Apr 2, 5:16 pm, kurtz le pirate
bonjour,

n'ayant rien trouvé sur le web et ayant besoin de déterminer l'os
d'origine d'un fichier pour déterminer le(s) caractère(s) de fin de
ligne, j'ai écrit ce petit bout de code :

#!/usr/bin/perl -w
use strict;
use IO::File;

sub FindOS {
my $thisFile = shift;
my $thisChar;
my $LineFeedCount=0;
my $CarriageReturnCount=0;
my @results;
my $fileHandle = new IO::File;
if ($fileHandle->open($thisFile,"r")) {
while (!eof($fileHandle)) {
$thisChar=getc($fileHandle);
if ($thisChar =~ /x0a/) { $LineFeedCount++; }
if ($thisChar =~ /x0d/) { $CarriageReturnCount++; }
}
$fileHandle->close;
if
(($CarriageReturnCount>0)&&($LineFeedCount==$CarriageReturnCount)) {
push @results,"0";
push @results,"Dos";
}
elsif (($LineFeedCount>0)&&($CarriageReturnCount==0)) {
push @results,"0";
push @results,"Unix";
}
elsif (($CarriageReturnCount>0)&&($LineFeedCount==0)) {
push @results,"0";
push @results,"Mac";
}
else {
push @results,"0";
push @results,"Inconnu";
}
}
else {
push @results,"-1";
push @results,$!;
}
return @results;
}

... que l'on peut utiliser comme ça :

$fileName = "le_nom_du_fichier_a_tester";
($error,$os) = FindOS($fileName);
if ($error==0) {
print "Le fichier '$fileName' est un fichier $os.n";
}
else {
print "Erreur pour le fichier '$fileName' : $os !n";
}

vous en pensez quoi ?


Je pense à "TIMTOWTDI".

Voici ma façon de faire la même chose:

============================ use strict;
use warnings;

my $fn = 'test.dat';
print "FindOS('$fn') = ", FindOS($fn), "n";

sub FindOS {
my $file = shift;
my ($LF_Count, $CR_Count) = (0, 0);

open my $fh, '<', $file or return -1, $!;
binmode $fh or return -1, $!;
local $/ = 32768; # read file in chunks of 32K at a time
local $_;
while (<$fh>) {
$LF_Count += () = /x0a/g;
$CR_Count += () = /x0d/g;
}
close $fh;

if ($CR_Count > 0 and $LF_Count == $CR_Count) { return 0,
'Dos' }
if ($CR_Count == 0 and $LF_Count > 0 ) { return 0,
'Unix' }
if ($CR_Count > 0 and $LF_Count == 0 ) { return 0,
'Mac' }
return 0, 'Inconnu';
}
============================
implémentation différente (TIMTOWTDI oblige) mais même esprit :))


--
klp

Publicité
Poster une réponse
Anonyme