2014-02-26 9 views
13

Dies ist ein häufiges Problem, das ich habe und meine Lösung ist ein wenig frech. Also suche ich nach einer schnellen Lösung und Erklärung des Problems.Excel speichert tabulatorgetrennte Dateien ohne Zeilenumbruch (UNIX/Mac OS X)

Das Problem ist, dass, wenn ich mich entscheide, eine Tabelle in Excel (Mac 2011) als Tab-getrennte Datei zu speichern, scheint es, es völlig in Ordnung zu tun. Bis ich versuche, die Datei Zeile für Zeile mit Perl zu analysieren. Aus irgendeinem Grund schlürft es das ganze Dokument in einer Zeile.

Meine brutale Lösung besteht darin, die Datei in einem Webbrowser zu öffnen und die Informationen in die tabstoppgetrennte Datei in TextEdit zu kopieren und einzufügen (ich verwende nie Rich-Text-Format). Ich habe versucht, eine neue Zeile am Ende der Datei einzuführen, bevor ich diesen Fix mache und das Problem nicht löst.

Was geht hier vor? Eine Erklärung würde geschätzt werden.

~ Dank! ~

+0

Was sind die Zeilenumbrüche in der Ausgabe und welche erwarten Sie? '\ n',' \ r' oder '\ r \ n'? Das Problem, das Sie beschreiben, kann auftreten, wenn die Ausgabe '\ n' Zeilenenden enthält (Standard in Unix), und Sie erwarten tatsächlich die' \ r \ n' Windows-Zeilenenden. Bitte überprüfen Sie, was tatsächlich da ist. – amon

+0

Wenn ich "weniger" benutze, sehe ich dieses Zeichen '^ M' – IMPERATOR

+1

Noch ein Grund, warum ich Microsoft hasse. –

Antwort

10

Das Problem ist, die tatsächlichen Zeichencodes, die neuen Linien auf verschiedenen Systemen zu definieren. Windows-Systeme verwenden häufig einen CarriageReturn + LineFeed (CRLF) und * NIX-Systeme verwenden nur einen LineFeed (LF).

Diese Zeichen können in RegEx als dargestellt werden \ r \ n oder\ n (jeweils).

Um eine Textdatei zu hashen, müssen Sie manchmal New Line-Zeichen parsen. Versuchen Sie, diese für DOS-to-UNIX in Perl:

perl -pi -e 's/\r\n/\n/g' input.file 

oder für UNIX-to-DOS mit sed:

$ sed 's/$'"/`echo \\\r`/" input.txt > output.txt 

oder für DOS-to-UNIX sed:

$ sed 's/^M$//' input.txt > output.txt 
+0

Ich habe versucht zu denken, wie dies sein Problem verursachen kann, und ich sehe nicht, wie es geht. Ich vermute, er geht stattdessen zu Windows. –

+0

Ich bleibe in UNIX und den gleichen Mac-Computer. Ich habe das Perl repariert und es hat funktioniert! Vielen Dank! Aber wissen Sie, ob Excel für UNIX formatierte Dokumente speichern kann? Ich verwende Excel 2011 für Mac, damit Sie meinen, es sollte möglich sein. – IMPERATOR

+0

Meine Vermutung ist, dass Microsoft diese Funktionalität nicht eingeführt/aktiviert hat und stattdessen versucht, die Kompatibilität mit ihren Windows-basierten Office-Produkten zu maximieren. – epluribusunix

4

eine ziemlich einfache Lösung für dieses Problem gefunden. Kopieren Sie Daten aus Excel in die Zwischenablage und fügen Sie sie in eine Google-Tabelle ein. Laden Sie die Google-Tabellendatei als Tab-getrennte Werte .tsv herunter. Dadurch wird das Problem umgangen, und Sie haben Tabulatortrennzeichen mit einem Zeilenende für jede Zeile.

+0

Keine Lösung, nur ein Work around. – Borodin

+0

In Excel für Mac können Sie dieses Problem umgehen, indem Sie alle in Excel kopieren und in Sublime Text einfügen. Speichern Sie diese Datei, und Zeilenumbrüche werden ordnungsgemäß erstellt. – safay

1

Perl verfügt über ein nützliches Regex-Muster \R, das mit jeder gebräuchlichen Zeilenendung übereinstimmt. Es passt eigentlich jede vertikale Leerzeichen - das gleiche wie \v - oder die CR LF-Kombination, so ist es das gleiche wie \r\n|\v

Dies ist nützlich, hier, weil Sie Ihre gesamte Datei in einen einzelnen skalaren schlürfen und dann split /\R/, die finden Sie eine Liste der Dateieinträge geben bereits chomp ed (wenn Sie die Linie Terminatoren halten möchten, können Sie split /\R\K/ statt

eine weitere Option ist das PerlIO::eol Modul.Es bietet eine neue Perl IO-Schicht, die Endungen Linie, egal was der Inhalt der Datei

sind zu normalisieren

Sobald Sie das Modul mit use PerlIO::eol geladen haben, können Sie es in einer open Anweisung

open my $fh, '<:eol(LF)', 'myfile.tsv' or die $!; 

oder Sie können sie die open Pragma es als Standard-Schicht für alle Eingabedatei setzen Griffe

use open IN => ':raw:eol(LF)'; 

, die mit einer Eingabedatei von jeder Plattform funktionieren wird

2

Noch eine andere Lösung ...

  • für eine tabstoppgetrennte Datei, das Dokument als
  • für eine durch Kommata getrennte Dateityp Windows Formatted Text (.txt) Datei speichern, das Dokument als `Windows-Comma Separated speichern (.csv) 'Dateityp