Thread new lines werden nicht erkannt: new lines von windows unter os x (19 answers)
Opened by Gast at 2006-01-12 00:41

Dubu
 2006-01-13 11:51
#61721 #61721
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Strat,12.01.2006, 12:53]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my (@newLine) = &AnalyzeFileEol($infile);
my $newLine = join("", map { chr(hex($_)) } @newline;
local $/ = $newLine;

# ------------------------------------------------------------
sub AnalyzeFileEol {
   my ($file) = shift;
   my $eol = chr(10);

   unless (open (FH, "<", $file)) {
    die "Error: couldn't read file '$file': $!\n";
   } # unless

   my @chars = ();

   while (defined (my $chr = getc(FH))) {
    my $hex = sprintf("%02X", ord($chr));

    if ($hex eq '0D') {
[...]
[/quote]
Sorry, strat, aber der Code tut nicht das, was er soll. Du liest die Datei nicht mit binmode(), deshalb wird dir fuer eine Datei mit CRLF-Zeilenumbruechen unter DOS/Windows ausgegeben, dass sie Unix-Format haette. Und die Umwandlung von jedem eingelesenen Char in eine Hexdarstellung, um dann einen Stringvergleich durchzufuehren, halte ich auch nicht fuer sehr effizient. (Und da sind noch zwei Syntaxfehler in den ersten beiden Zeilen.)

Ich hab's hier mal etwas ueberarbeitet:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/perl
use strict;
use warnings;

my $filename = shift;

{
   local $/ = LineSeparator($filename);

   # mach was mit der Datei
}

exit 0;

############################################################

sub LineSeparator {
   my ($file) = @_;

   open (my $infile_h, '<', $file) or die "could not open '$file' for reading: $!";
   binmode $infile_h;
   my $eol = '';
   my $format = 'unknown';

   while (defined (my $chr = ord getc($infile_h))) {
       if ($chr == 0x0D) {
           $chr = ord getc($infile_h);
           if ($chr == 0x0A) {
               $format = 'DOS';
               $eol = "\x0D\x0A";
           } else {
               $format = 'MacOS 9 or earlier';
               $eol = "\x0D";
           }
           last;
       } elsif ($chr == 0x0A) {
           $format = 'UNIX';
           $eol = "\x0A";
           last;
       }
   }
   close $infile_h;
   print STDERR "Line terminator format: $format\n";
   return $eol;
}


Generell hat dieser Ansatz noch den Nachteil, dass das erstbeste Vorkommen von einem CR oder NL ueber das Dateiformat entscheidet. Man koennte vielleicht eine etwas vorsichtigere Heuristik anwenden, die die Haeufigkeit der verschiedenen Zeichen oder Zeichenkombinationen auswertet.

View full thread new lines werden nicht erkannt: new lines von windows unter os x