Verfasst am: 25.01.2017, 11:36
Titel: Auslesen einer txt mit leeren Zeilen
Hallo. Ich habe eine Frage zum auslesen einer Textdatei. Ich habe das Forum schon durchsucht, fand aber leider keine passende Lösung für mein Problem. Habe erst vor kurzem mit Matlab angefangen.
Die Textdatei besteht aus einem Header und anschließend folgen 1024 Zeilen mit Daten gefolgt von drei Abschlusszeilen. Dieser ganze Block wiederholt sich innerhalb der Textdatei. Ich habe eine Textdatei im Anhang beigefügt.
Das Problem an der Sache ist, es sollten 6204 Zeilen eingelesen werden. Es befinden sich 6 Blöcke in der Datei.
6 x 7 Zeilen für den Header
6 x 1024 Zeilen für die Daten
6 x 3 Zeilen für das Ende des Blockes
Das wären 6204 Zeilen. Er ließt aber nur 6192 Zeilen ein. Die Funktion überspringt einfach die leeren Zeilen in der Datei. Das sind genau 12 Zeilen. Wie kann ich die Zeilen mit lesen. Unglücklicherweise heißt das, die Funktion schneidet die letzten 12 Zeilen einfach ab. Die Zeilen 6192 bis 6201 enthalten aber noch Daten.
Kann mir vielleicht jemand weiterhelfen wie ich die Datei richtig einlese?
Mit freundlichem Gruß
Henrik Schädlich
Stepped_Sine.txt
Beschreibung:
Daten der Messung mit den sich wiederholenden Blöcken.
Mir ist nicht ganz klar was du meinst. Ich kann natürlich die Funkiton importdata aufrufen und den Quellcode ändern. Damit kenne ich mich aber noch weniger aus. Meintest du das?
Mein komplettes Programm zum Einlesen sieht so aus.
%---amount of measured points---%
NumberOfSteps = length(pos)
%---table dimension of output data---%
height=2*length(freq)+1
Aton=zeros(NumberOfSteps,height)
for i = 1:NumberOfSteps
filename = [Folder 'Point' num2str(i) '\Stepped_Sine.txt'];
A = importdata(filename,delimiterIn);
%---Matrix for first measurment block in the txt.---%
for ii = 8:1:1031
B{ii-7,1}=A{ii,1};
B{ii-7,1}=strrep(B{ii-7,1},',','.');
C(ii-7,:)=strread(B{ii-7,1},'%s');
end
A1=str2double(C);
%---Repetition for second block in the txt.---% for ii = 1042:1:2065
B{ii-1041,1}=A{ii,1};
B{ii-1041,1}=strrep(B{ii-1041,1},',','.');
C(ii-1041,:)=strread(B{ii-1041,1},'%s');
end
A2=str2double(C);
%---Repetition for third block in the txt.---%
for ii = 2076:1:3099
B{ii-2075,1}=A{ii,1};
B{ii-2075,1}=strrep(B{ii-2075,1},',','.');
C(ii-2075,:)=strread(B{ii-2075,1},'%s');
end
A3=str2double(C);
%---Repetition for fourth block in the txt.---% for ii = 3110:1:4133
B{ii-3109,1}=A{ii,1};
B{ii-3109,1}=strrep(B{ii-3109,1},',','.');
C(ii-3109,:)=strread(B{ii-3109,1},'%s');
end
A4=str2double(C);
%---Repetition for fifth block in the txt.---% for ii = 4144:1:5167
B{ii-4143,1}=A{ii,1};
B{ii-4143,1}=strrep(B{ii-4143,1},',','.');
C(ii-4143,:)=strread(B{ii-4143,1},'%s');
end
A5=str2double(C);
%---Repetition for sixth block in the txt.---% for ii = 5178:1:6192
B{ii-5177,1}=A{ii,1};
B{ii-5177,1}=strrep(B{ii-5177,1},',','.');
C(ii-5177,:)=strread(B{ii-5177,1},'%s');
end
A6=str2double(C);
Sobald ich im letzten Block i bis 6204 laufen lasse, funktioniert das Programm nicht mehr. Die eingelesene Variable A hat auch nur 6192 Zeilen und nicht 6204.
dein Code sieht sehr (und unnötig) kompliziert aus.
Zitat:
Ich kann natürlich die Funkiton importdata aufrufen und den Quellcode ändern. Damit kenne ich mich aber noch weniger aus. Meintest du das?
Nein. Rechtsklick auf die Datei im Current Folder Browser und Import Data auswählen. Dort kannst du interaktiv zusammenstellen, was du benötigst, und auch ein Skript oder eine Funktion generieren.
Ok da kann ich immerhin schonmal die Zeilen ändern und die Funktion gleich mitnehmen. Klasse. Super Tipp.
Ich bin noch relativ neu im Forum und arbeite erst seit kurzem damit also erwarte nicht zu viel. Wenn du konstruktive Vorschläge hast, höre ich mir die gerne weiter an. Einfach nur "unnötig" und "zu kompliziert" nützt gar nichts und niemandem.
Die Programmstruktur ist mir soweit klar. Zu erst Header Überspringen, dann die 1024 Zeilen einlesen und Kommazeichen ersetzen. Der gelesen Wert Value wird an entsprechende Stelle in Result eingefügt. Anschließend drei Zeilen überspringen und in den nächsten Block gehen. Die Lösung ist echt super.
Beim obigen Skript ist mir dann aber aufgefallen, dass möglicherweise ein Fehler in der Dimension besteht. Es sind nicht 1024 Zeilen definiert worden.
bei mir läuft der von dir gepostete Code durch und liefert auf den ersten Blick sinnvolle Ergebnisse.
Bitte kopiere die Fehlermeldung inkl. Zeilennummer und andere Informationen, die erklären könnten, warum der Code bei dir nicht durchläuft, bei mir aber schon (z.B. verwendetes Release).
Ich habe es falsch gesehen. Es sind 1024 Spalten und 9 Zeilen bei 6 Blöcken. Ich arbeite mit Matlabl R2011a. Nur so am Rand, sagen wir einmal ich hätte gerne 9 Spalten und 1024 Zeilen mit 6 Blöcken. Wie gehe ich da vor?
X(:, a,b)
greift auf die erste Dimension des Array zu, wobei nebeneinander liegende Bytes im Ram addressiert werden. Das ist effizienter als
X(a, :, b)
. Wenn Du nach dem Einlesen die Dimensionen vertauschen willst, geht das mit:
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.