Hallo,
ich darf ein kleines Perlscript unter MacOSX entwickeln. Im wesentlichen geht es um Textverarbeitung einiger CSV-Dateien, nichts aufregendes.
Allerdings habe ich Probleme, eine CSV-Datei korrekt einzulesen, da die Zeilentrenner nicht korrekt erkannt werden. Der Mac-interen Textedit zeigt die Datei korrekt an. Perl und auch der vi (eigentlich alle gnu-tools) schmeissen alles auf eine Zeile, zwischendurch ein paar ^M. file sagt mir: kunden.txt: Non-ISO extended-ASCII text, with CR, NEL line terminators
Auf was muss ich $/ in Perl stellen, damit die Zeilen sauber erkannt werden?
Mit freundlichen Grüßen
Jens Puruckherr
Linux-User-Group Dresden lug-dd@schlittermann.de on Mon Apr 11 2005 at 21:50 +0100 wrote:
Jens Puruckherr wrote:
Auf was muss ich $/ in Perl stellen, damit die Zeilen sauber
erkannt
werden?
Die Eingabedatei vorher durch fromdos(1) jagen, als Bash-Lösung. Perl-technisch kann ich nicht weiterhelfen.
hm, noch nie gehört. Ich möchte auch mit OSX-Bordmitteln auskommen, ich weiss ja nicht, auf welchen Arbeitsplätzen das Progrämmchen mal laufen soll. Auserdem wurde die CSV-Datei nicht auf ner Windowskiste, sondern auch auf einem Mac erzeugt, allerdings mit irgendwas proprietären. Auf meiner Linux-Box sieht die gleiche Datei genauso verschoben aus, wie auf dem MAC.
Mit freundlichen Grüßen
Jens Puruckherr
Jens Puruckherr wrote:
Auf was muss ich $/ in Perl stellen, damit die Zeilen sauber erkannt werden?
Jut, das war mißverständlich ausgedrückt, zurück zur eigentlichen Frage. Deine Eingabedatei hat die "falschen" Zeilenumbrüche. Aus der manpage von tofromdos: "DOS (and Windows) text files traditionally have carriage return and line feed pairs as their newline characters while Unix text files have the line feed as their newline character."
Die Zeilenenden sind also "\r\n". Dein Perl scheint aber nur "\n" zu fressen. Du mußt also die "\r" (Carriage Return, CR) loswerden, oder mit in die Regular Expression quetschen.
MfG Sebastian
Linux-User-Group Dresden lug-dd@schlittermann.de on Tue Apr 12 2005 at 08:58 +0100 wrote:
Die Zeilenenden sind also "\r\n". Dein Perl scheint aber nur "\n" zu fressen. Du mußt also die "\r" (Carriage Return, CR) loswerden, oder mit in die Regular Expression quetschen.
Letztenendlich klappte es mit nur einem \r als Zeilentrenner, mein Progrämmchen arbeitet wie es oll. Danke an alle.
Jetzt aber noch was generelles dazu. Nun will ich so eine verkorkste Datei auch mit was normalen anschauen wie meinen vi oder less oder ... welchen Trick verwende ich hier, um das gewünschte Ergebnis zu erhalten? Das mit tr() ist eine Variante. Möglicherwiese will ich die Datei aber nicht verändern. Hilft es mir hier, die Variable IFS umzubiegen?
Mit freundlichen Grüßen
Jens Puruckherr
Jens Puruckherr wrote:
Linux-User-Group Dresden lug-dd@schlittermann.de on Tue Apr 12 2005 at 08:58 +0100 wrote:
Die Zeilenenden sind also "\r\n". Dein Perl scheint aber nur "\n" zu fressen. Du mußt also die "\r" (Carriage Return, CR) loswerden, oder mit in die Regular Expression quetschen.
Letztenendlich klappte es mit nur einem \r als Zeilentrenner, mein Progrämmchen arbeitet wie es oll. Danke an alle.
Jetzt aber noch was generelles dazu. Nun will ich so eine verkorkste Datei auch mit was normalen anschauen wie meinen vi oder less oder ... welchen Trick verwende ich hier, um das gewünschte Ergebnis zu erhalten? Das mit tr() ist eine Variante. Möglicherwiese will ich die Datei aber nicht verändern. Hilft es mir hier, die Variable IFS umzubiegen?
Mit vim anschauen und ":se ff=mac" Dazu im vim mal ":help ff" anschauen :-)
Ciao, Thomas
Am Mittwoch, 13. April 2005 07:58 schrieb Jens Puruckherr:
Jetzt aber noch was generelles dazu. Nun will ich so eine verkorkste Datei auch mit was normalen anschauen wie meinen vi oder less oder ... welchen Trick verwende ich hier, um das gewünschte Ergebnis zu erhalten?
Im VIM kannst du das Dateiformat verändern. mMn sollte er das aber schon beim öffnen der Datei richtig erkennen. Ansonsten sollte ":set fileformat mac" helfen.
http://vimdoc.sourceforge.net/htmldoc/options.html#%27fileformat%27
Jens
Hi Jens,
On Tue, Apr 12, 2005 at 07:44:33 +0200, Jens Puruckherr wrote:
Die Eingabedatei vorher durch fromdos(1) jagen, als Bash-Loesung. Perl-technisch kann ich nicht weiterhelfen.
hm, noch nie gehoert. Ich moechte auch mit OSX-Bordmitteln auskommen, ich weiss ja nicht, auf welchen Arbeitsplaetzen das Prograemmchen mal laufen soll. Auserdem wurde die CSV-Datei nicht auf ner Windowskiste, sondern auch auf einem Mac erzeugt, allerdings mit irgendwas proprietaeren. Auf meiner Linux-Box sieht die gleiche Datei genauso verschoben aus, wie auf dem MAC.
fromdos(1) ist die falsche Loesung, weil es von CR+LF Zeilenenden ausgeht. Bevor Mac OS ein Betriebssystem wurde (also vor OS X) waren die Zeilenenden dort _nur_ CR (wahrscheinlich schleppen das diverse MAC-Tools noch immer mit sich rum). Versuchs mal mit tr(1):
tr "\015" "\012" < macdatei > unixdatei
bye, Chris
Und das schnitzte Jens Puruckherr ins Brett:
Auf was muss ich $/ in Perl stellen, damit die Zeilen sauber erkannt werden?
\n für *nix \r\n für DOS, Windows \r für Mac
HTH
Jörg http://www.dresden-pm.org
lug-dd@mailman.schlittermann.de