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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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
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
On Apr 2, 5:16 pm, kurtz le pirate <kurtzlepir...@yahoo.fr> 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';
}
========================= ====
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
"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
"Klaus" <klaus03@gmail.com> a écrit dans le message de news:
1175887980.394388.308780@b75g2000hsg.googlegroups.com...
On Apr 2, 5:16 pm, kurtz le pirate <kurtzlepir...@yahoo.fr> 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 :))
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 :))