Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

re-inventer la roue ?

3 réponses
Avatar
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 ?

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

3 réponses

Avatar
Patrick Texier
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.

Avatar
Klaus
On Apr 2, 5:16 pm, kurtz le pirate wrote:
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

Avatar
kurtz_le_pirate
"Klaus" a écrit dans le message de news:

On Apr 2, 5:16 pm, kurtz le pirate wrote:
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