Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7611[/thread]

new lines werden nicht erkannt: new lines von windows unter os x (Seite 2)



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
Dubu
 2006-01-12 13:27
#61714 #61714
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Das klappt so nicht unter DOS/Windows, da beim Einlesen aus einer Textdatei bereits "\x0d\x0a" in "\x0a" bzw. "\n" umgewandelt wird.

Deshalb muss vor der Schleife noch binmode eingefuegt werden:
Code: (dl )
1
2
binmode STDIN or die $!;
binmode STDOUT or die $!;

Am besten auch while (<>) durch while (<STDIN>) ersetzen, damit wirklich nur von STDIN gelesen wird.
Dann muss man noch mit Ein- und Ausgabeumleitung arbeiten und es funktioniert von der Kommandozeile:
Code: (dl )
C:\> perl dos2unix.pl < dostext.txt > unixtext.txt


Die Eingabeumleitung ist dabei auch wichtig, denn falls die Daten nicht von STDIN kommen, sondern der Diamantoperator <> "magisch" Dateien aus @ARGV einliest und oeffnet, dann heisst das Filehandle nicht STDIN sondern ARGV und das binmode STDIN wirkt nicht:
Code: (dl )
C:\> perl dos2unix.pl dostext.txt > unixtext.txt   # klappt nicht!

Es liegt zwar nahe, statt binmode STDIN ein binmode ARGV zu versuchen, aber vor der Schleife ist das ARGV-Filehandle noch gar nicht geoeffnet und in der Schleife ist es zu spaet - die erste "Zeile" (tatsaechlich die ganze Datei) ist dann schon eingelesen. Da muesste man also ohne Magie arbeiten und die Dateien "von Hand" oeffnen.
Strat
 2006-01-12 13:53
#61715 #61715
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
$/ = "\r\n"; fuer sowas zu verwenden ist gefaehrlich, weil \n je nach OS einen unterschiedlichen wert (naemlich den des OS) annimmt; besser murphy's weg waehlen, oder die einkommende Datei parsen und hoffen, dass es keine binaere Datei ist, z.B. auf die schnelle:
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
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') {
my $next = sprintf("%02X", ord(getc(FH)));

if ($next eq '0A') { close (FH);
print "Newline format: Dos: $hex $next\n";
return ($hex,$next);
} # if
else { close (FH);
print "Newline format: Mac: $hex\n";
return ($hex);
} # else
} # if
elsif ($hex eq '0A') { close (FH);
print "Newline format: Unix: $hex\n";
return ($hex);
} # elsif
} # while

die "Error: couldn't find out file format\n";

close (FH);
return;
} # AnalyzeFile
# ------------------------------------------------------------
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2006-01-12 17:04
#61716 #61716
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
ich würde das Übel an der Wurzel packen und die Datei im ASCII-Modus übertragen... Ansonsten mit gvim öffnen, Menü Editieren -> Dateieinstellungen -> Dateiformat wählen und dann speichern, fertig.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2006-01-12 17:26
#61717 #61717
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn man sich auf den uebertragungsweg 101% verlassen kann, klar. aber selbst bei automatisch erzeugten dateien und automatischer uebertragung bin ich da sehr vorsichtig; was passiert, wenn mal eine netzwerkleitung wegbricht und da irgend jemand die datei manuell per ftp oder so uebertraegt und dabei den korrekten modus vergisst? Oder wenn das exportprogramm upgedated wird und schrott baut?

Wenn davon kritische aktionen abhaengen, vertraue ich da niemandem; ich habe z.B. nicht gerne eine Datenbank, wo einige zig tausend Datensaetze wegen sowas geloescht werden.
Ok, alleine das dateiformat zu ueberpruefen reicht noch nicht, aber es ist ein wichtiger schritt.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2006-01-12 23:37
#61718 #61718
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Naja, wenn man murphys Weg nimmt, packt man die Datei zweimal an. Das kann sinnvoll sein - wenn man die Datei in mehreren Programmen verwendet oder "unnoetig" - wenn die Datei nur in diesem einen Programm einmal eingelesen wird...

Gut, man kann dann in meinem Code-Snippet die Hexwerte von murphy nehmen - ueberzeugt...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2006-01-13 00:42
#61719 #61719
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=picknicker187,12.01.2006, 01:24]oh mann, dieses scheiss cpan funktioniert einfach nicht. es meckert weil ein paket nicht installiert ist, will man das dann installieren beklagt es sich, dass ein anderes nicht da ist.....ich hab gerade überhaupt garkeine zeit für sowas.[/quote]
Schick doch mal die Fehlermeldungen. CPAN sollte unter MacOSX funktionieren...
renee
 2006-01-13 01:05
#61720 #61720
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das ist kein Fehler, das ist so gewollt. Einige Module haben Abhaengigkeiten (andere Module, die in dem gewuenschten Modul benoetigt werden). Damit dann das von Dir gewuenschte Modul ueberhaupt funktioniert, muessen diese Abhaengigkeiten ebenfalls installiert werden...

Das mit 'gar keine zeit' ist etwas uebertrieben (meiner Meinung nach), da mit CPAN.pm die Installation (halb-)automatisch ablaeuft...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
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.
picknicker187
 2006-01-14 20:35
#61722 #61722
User since
2006-01-12
6 Artikel
BenutzerIn
[default_avatar]
ganz einfach gehts auch (und das hab ich jetzt so gemacht), wenn man hinter jede zeile einen "." setzt und den dann als $/ benutzt :)

gruß,

michel
renee
 2006-01-14 21:24
#61723 #61723
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das nenne ich aber nicht einfach, weil Du das manuell machen musst, waehrend die anderen Wege alle automatisch sind. Und mit '.' trennst Du ja nicht unbedingt nach Zeilen, sondern wenn "Saetze" in der Datei vorkommen, teilst Du mitten in der Zeile...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2006-01-12 00:41.