2016-03-21 10 views
0

Ich habe eine Textdatei mit mehreren Abschnitten der Beobachtungen. Jedes Mal, wenn die neue Beobachtung beginnt, enthält die Datei einige Informationen für die folgenden Daten (wie den Header einer Datei).Ignorieren Kopfzeilen in der Mitte der Textdatei mit Matlab

Wenn ich textscan verwendet habe, konnte ich nur den ersten Abschnitt nur lesen. Zum Beispiel werden die Daten wie folgt angeordnet:

1993-01-31 17:00:00.000 031  -61.00 

1993-01-31 18:00:00.000 031  -55.00 

1993-01-31 19:00:00.000 031  -65.00 

Format             
Source of Data       
Station Name    
Data Interval Type  1-hour          
Data Type    Final           

1993-02-01 00:00:00.000 032  -83.00 

1993-02-01 01:00:00.000 032  -70.00 

1993-02-01 02:00:00.000 032  -64.00 

Von oben, ich mag nur Datenleitungen, beginnend mit ‚1993‘ lesen, indem Sie den Textblock in der Mitte zu ignorieren.

+0

du wird die Datei Zeile-für-Zeile zu analysieren haben, oder eine Vorverarbeitung auf die Datei gelten entferne diese Headerzeilen (benutze 'grep' oder' sed' UNIX Tools, um Zeilen zu entfernen, die mit [a-zA-Z] beginnen) – Amro

Antwort

2

Wie Sie bemerkt haben, hört textscan auf zu lesen, wenn der Eingang nicht mehr analysiert werden kann. Sie können dies tatsächlich zu Ihrem Vorteil nutzen. In Ihrem Fall wissen Sie beispielsweise, dass zwischen jedem "guten" Datensatz 5 Zeilen Abfall liegen. So können wir textscan einmal ausführen, um den ersten Satz zu erhalten, dann führen Sie ihn nacheinander aus (mit Headerlines auf 5, um diese 5 Zeilen zu ignorieren), um jeden der "guten" Datensätze in der Datei zu erhalten. Verketten Sie dann alle Daten.

Dies funktioniert, weil, wenn Sie textscan mit einer Dateikennung verwenden, ist es nicht zurückspulen die Dateikennung an den Anfang der Datei zurück, nachdem er zurückkehrt. Es lässt es genau da, wo es aufgehört hat, es zu parsen. Daher rechts der nächste Aufruf von textscan beginnt dort, wo Sie aufgehört hat (abzüglich alle Kopfzeilen geben Sie)

fid = fopen(filename, 'r'); 

% Don't ignore any lines but read until we stop 
data = textscan(fid, formatspec); 

% Repeat until we hit the end of the file 
while ~feof(fid) 
    % Skip 5 lines and read until we can't read anymore 
    newdata = textscan(fid, formatspec, 'HeaderLines', 5); 

    % Append to existing data 
    data = cellfun(@(x, y)cat(1, x, y), data, newdata, 'uni', 0); 
end 

fclose(fid) 
+0

Bitte sag mir was ist 'formatspec'? – Mushi

+0

@Mushi Dies ist der Formatbezeichner, mit dem Sie Ihre Datei ursprünglich analysiert haben. Ich wusste nicht, was du in deinem Fall benutzt hast, also habe ich es einfach zu einer Variable gemacht. Wenn Sie den Code posten, den Sie verwendet haben, um dies in Ihrer Frage zu analysieren, kann ich das hier einfügen. Es ist die zweite Eingabe für 'textscan' – Suever

+0

Entschuldigung für die Nachfrage. Ich habe es gemerkt, nachdem ich gefragt hatte. Nun, die Sache ist, dass die Daten, die ich bekomme, nicht verkettet sind. Ich habe Daten in Blöcken, die der Anzahl der Beobachtungen entsprechen. Jeder Brocken hat die Form einer Zelle. Irgendeine Idee, wie man es repariert. – Mushi