|
Autor |
Textfile einlesen mit unterschiedlich langen Header |
|
Markus_Sw
Aktiv  Dabei seit: 21.03.2015 Mitteilungen: 80
 | Themenstart: 2020-12-11
|
Hallo,
ich möchte gerne Textfiles einlesen, bei denen der Header unterschiedlich lang ist, diesen möchte ich überspringen.
Die Files sehen so aus:
#..
#blabla
#blabla....
#blabla...
So geht das ca. 50-60 Zeilen lang, danach kommen dann
meine Messwerte(29 Spalten, unterschiedlich Zeilenlänge), wie kann ich sagen, dass ich das alle Zeilen überspringen möchte die mit "#" anfangen?
Danke Gruß
Markus
|
Profil
|
rlk
Senior  Dabei seit: 16.03.2007 Mitteilungen: 11603
Wohnort: Wien
 | Beitrag No.1, eingetragen 2020-12-11
|
Hallo Markus_Sw,
eine sehr ähnliche Frage wurde unlängst in
https://matheplanet.at/matheplanet/nuke/html/viewtopic.php?topic=250049
beantwortet.
Servus,
Roland
|
Profil
|
Markus_Sw
Aktiv  Dabei seit: 21.03.2015 Mitteilungen: 80
 | Beitrag No.2, vom Themenstarter, eingetragen 2020-12-12
|
Hallo Roland, danke für den link, leider funktioniert das bei mir nicht.Bei dem Befehl cell2mat, meckert er, liegt wahrscheinlich daran das ich ein paar „nan“ in der 1.Reihe (und auch sonst zwischendurch )stehen habe? Wenn ich den Befehl cell2mat lösche, bekomme ich als data ein cell als Ergebnis in dem am Anfang 0xsingle steht, und irgendwo in der Mitte die Daten stehen. Kannst du mir erklären was diese Weile Schleife genau macht?
Danke und Gruß Markus
|
Profil
| Folgende Antworten hat der Fragensteller vermutlich noch nicht gesehen. |
rlk
Senior  Dabei seit: 16.03.2007 Mitteilungen: 11603
Wohnort: Wien
 | Beitrag No.3, eingetragen 2020-12-15
|
Hallo Markus_Sw,
hier ist das von Majoka in https://matheplanet.at/matheplanet/nuke/html/viewtopic.php?topic=250049&post_id=1820048
vorgeschlagene Programm.
\sourceon Matlab
\numberson
fid = fopen('dateiname.txt');
data = [];
while 1
line = fgetl(fid)
if line == -1
break;
end
if ~isempty(line)
C = textscan(line, '%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32%f32');
data = [data; cell2mat(C)];
end
end
data
\sourceoff
In der while -Schleife wird eine Zeile nach der anderen in die Variable line eingelesen und falls sie nicht leer ist wird versucht, die Daten mit textscan (Zeilen 10-13) zu extrahieren und an das Feld data anzuhängen.
Ich würde es etwas anders machen, die folgende Funktion ist ungetestet:
\sourceon Matlab
\numberson
function mData = read_file_skipping_header(sFilename, iColumns)
iFid = fopen(sFilename, 'r');
if (iFid == -1)
error('cannot read %s\n', sFilename);
end
iPos = ftell(iFid);
sLine = fgetl(iFid);
while (sLine(1) == '#')
iPos = ftell(iFid);
sLine = fgetl(iFid);
end
iStatus = fseek(iPos, 'bof');
if (iStatus == -1)
error('cannot seek position %d in %s\n', iPos, sFilename);
end
mData = fscanf(iFid, '%f', [iColumns, Inf]);
fclose(iFid);
end
\sourceoff
In den Zeilen 6-11 werden Zeilen gelesen und überprüft, ob sie mit # beginnen. Das ist etwas umständlich, weil Matlab keine Schleife mit Test am Ende anbietet. Nach dem Verlassen der Schleife wurde bereits die erste Zeile mit Daten gelesen, deshalb wird die Position das Zeilenbeginns in iPos gespeichert und die Datei in Zeile 12 auf diese Stelle zurückgespult. In Zeile 16 werden dann endlich die Daten gelesen.
Die Erkennung und Behandlung von Fehlern bei den Aufrufen von fgetl überlasse ich Dir.
Servus,
Roland
|
Profil
|
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|