2016-07-08 14 views
0

Ich habe viele Fragen zu CSV-Dateien gefunden, aber nicht in Bezug auf eine normale ASCII-Datei (.dat) Datei.Erhalten Sie die Anzahl der Spalten in einer ASCII-Datei

Angenommen, ich habe eine Subroutine sub writeMyFile($data), die verschiedene Werte in eine ASCII-Datei schreibt my_file.dat. Jede Spalte ist dann ein Wert, den ich in einer anderen Unterroutine sub plotVals() darstellen möchte, aber dafür muss ich die Anzahl der Spalten von my_file.dat kennen, die nicht immer die gleiche ist.

Was ist eine einfache und lesbare Möglichkeit in Perl, die Anzahl der Spalten einer ASCII-Datei my_file.dat zu haben?

Einige Beispiel Eingabe/Ausgabe-wäre (Anmerkung: Datei mehrere Zeilen haben könnte):

In:

(first line on my_data1.dat) -19922 233.3442 12312 0 0 
(first line on my_data2.dat) 0 0 0 

Out:

(for my_data1.dat) 5 
(for my_data2.dat) 3 
+1

Meinst du, wie viele Zeichen ist jede Zeile breit? Können Sie eine Beispieleingabe/-ausgabe angeben? – xxfelixxx

+0

Ändern 'writeMyFile', um die Anzahl der Spalten als erste Zeile der Datei hinzuzufügen? – Borodin

+0

@xxfelixxx Entschuldigung, Sie haben Recht! Ich habe 2 Dummy-Beispiele hinzugefügt. Ich gehe davon aus, dass die Datei vollständig gefüllt ist (daher fehlen in den unteren Zeilen keine Messungen), und wahrscheinlich sollte eine leere Datei "0" oder "undef" zurückgeben. –

Antwort

3

Sie haben uns nicht wirklich genug Details gegeben, damit eine Antwort wirklich hilfreich ist (das Format Ihrer Datendatei wäre zum Beispiel eine große Hilfe gewesen).

Aber nehmen wir an, dass Sie eine Datei haben, wo die Felder, die durch Leerzeichen getrennt sind - etwa so:

col1 col2 col3 col4 col5 col6 col7 col8 

Wir wissen nichts über die Spalten, nur, dass sie durch unterschiedliche Mengen an Leerraum getrennt sind.

Wir können die Datei in der üblichen Weise öffnen.

my $file = 'my_file.dat'; 
open my $data_fh, '<', $file or die "Can't open $file: $!"; 

Wir können jeden Datensatz aus der Datei der Reihe nach in der üblichen Weise lesen.

while (<$data_fh>) { 
    # Data is in $_. Let's remove the newline from the end. 
    chomp; 
    # Here we do other interesting stuff with the data... 
} 

Wahrscheinlich eine nützliche Sache zu tun wäre, um den Datensatz zu spalten, so dass jedes Feld in einem separaten Elemente eines Arrays gespeichert ist. Das ist einfach mit split().

# By default, split() works on $_ and splits on whitespace, so this is 
# equivalent to: 
# my @data = split /\s+/, $_; 
my @data = split; 

Jetzt kommen wir zu Ihrer Frage. Wir haben alle unsere Werte in @data. Aber wir wissen nicht, wie viele Werte es gibt. Zum Glück macht es Perl einfach, die Anzahl der Elemente in einem Array herauszufinden. Wir weisen das Array nur einer skalaren Variablen zu.

my $number_of_values = @data; 

Ich denke, das ist alles, was Sie brauchen.Abhängig vom tatsächlichen Format Ihrer Datendatei müssen Sie möglicherweise die Zeile split() auf irgendeine Weise ändern. Ohne weitere Informationen können wir jedoch nicht wissen, was Sie dort benötigen.

+0

Danke für Ihre Antwort! Ich habe einige Dummy-Beispiele in der ursprünglichen Frage zur Verfügung gestellt. Wir können wahrscheinlich davon ausgehen, dass die Datei vollständig gefüllt ist (also keine Messungen in den unteren Zeilen fehlen), und dass eine leere Datei "0", "undef" oder etwas Ähnliches zurückgeben sollte –

+0

Ok, es sieht so aus Format war korrekt. Also etwas basierend auf meinem Code wird funktionieren. Glücklich könnte ich helfen. –

+0

Nur eine Folgefrage. Was ist, wenn die Datei führende Leerzeichen enthält? In diesem Fall würde die Regex denken, dass ein zusätzliches Zeichen in der Datei ist, bin ich richtig? Gibt es einen einfachen Weg, diesen Randfall zu überwinden? –

0

Wenn in plotVals() Lesen der Datei , teilen Sie jede Zeile mit dem Trennzeichen, das Sie in der Datendatei verwenden, und zählen Sie, wie viele Felder Sie erhalten. Ich gehe davon aus, dass Sie die Zeilen trotzdem aufteilen müssen, um die einzelnen Datenpunkte zu plotten, es sei denn, Sie rufen ein externes Dienstprogramm zum Plotten auf. Wenn Sie ein externes Dienstprogramm zum Plotten aufrufen, genügt es, eine repräsentative Zeile (die erste?) Zu lesen und die Felder darin zu zählen.

Alternativ können Sie die Daten oder einige Metadaten (die Anzahl der Spalten) direkt an plotVals() übergeben.

Verwandte Themen