Thread Text::CSV und End of line (4 answers)
Opened by Kuerbis at 2021-07-14 19:10

haj
 2021-07-14 22:16
#193426 #193426
User since
2015-01-07
529 Artikel
BenutzerIn

user image
Das ist ein bisschen wacklig, wenn's auch auf Windows "richtig" laufen soll.
CPAN:Text::CSV ist leider ein bisschen schwammig in der Beschreibung, wie das bei der Ausgabe ablaufen soll. Hier das Verhalten der Funktion csv:
  • Wenn man da eol nicht angibt, schreibt er \r\n, auf allen Plattformen. Das ist auch RFC4180-konform (da steht CRLF).
  • Wenn man eol => "\n" (oder eol = $/) angibt, dann schreibt er "\n" auf Linux und "\r\n" auf Windows. Bei Windows ist eben per Default der :crlf-Layer aktiv, und anscheinend tut Text::CSV nichts, um den abzuschalten.
  • Wenn man eol => "\r\n" angibt, dann schreibt er "\r\n" auf Linux und "\r\r\n" auf Windows. Das ist eher unerwünscht.


Die solide Variante wäre also, eol nicht anzugeben und also auch nicht im CPAN:App::DBBrowser anzubieten - das schlage ich auch vor. Dann steht CRLF in den CSV-Dateien, das ist RFC-konform ud die handelsüblichen CSV-Tools sollten damit klarkommen.

Etwas Kleingedrucktes:
$/ ist der $INPUT_LINE_SEPARATOR und der ist auf Windows und Linux gleich "\n". Der Unterschied entsteht erst bei den I/O-Layern. Ausgabe ist aber nicht Input, den als Wert zu verwenden wäre schräg. Es gibt auch $\, den $OUTPUT_LINE_SEPARATOR. Der ist normalerweise undef, sein Inhalt wird an jede print-Ausgabe drangehängt. Damit ist das auch ungeeignet, um ein überzähliges \r von Text::CSV zu eliminieren.

View full thread Text::CSV und End of line