WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Textdatei einlesen, sehr viele Nachkommastellen

 

Katja

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 17:01     Titel: Textdatei einlesen, sehr viele Nachkommastellen
  Antworten mit Zitat      
Hallo,

ich möchte eine Reihe von Textdateien einlesen. Die Dateien bestehen aus einem Header, der in jeder Datei gleich ist sowie 2 Datenblöcken, die unterschiedlich lang sein können.

Aufbau der Textdateien (ein Beispiel habe ich angehängt):

Header
Leerzeile
Text
Datenblock
Leerzeile
Text
Datenblock

So sieht mein erster Versuch aus:

Code:
 file = fopen('Record_2.txt','r');
  data=importdata('Record_2.txt');
  fclose(file);


Probleme:

1. Es wird nur der Header und der erste Datenblock eingelesen. Der zweite Datenblock fehlt.
2. Da die Zahlen extrem viele Nachkommastellen haben, werden sie nicht komplett ausgelesen: original: 223138.76943745999597 ausgelesener Wert: 2.231387694374600e+05 ->6 Stellen fehlen

So sieht mein zweiter Versuch aus:

Code:
file = fopen('Record_2.txt','r');
 for i=1:14
    fgetl(file);
 end
 for i=1:23
    data = textscan(file,'%u %u %n %n %u %n %n %n %n %n %n %n');
 end
fclose(file);


Problem:

Header und Text werden korrekt übersprungen. Vom Datenblock wird allerdings nur jeweils die erste Zahl korrekt eingelesen. Der Rest des cell arrays "data" bleibt leer.

Fragen:

1. Wie kann ich die komplette Datei inklusive 2. Datenblock einlesen? (dabei habe ich keine Information, wie lang der 2. Datenblock ist)

2. Wie verfahre ich mit den Zahlen, die zu viele Nachkommastellen haben?

Ich freue mich über jeden Input und hoffe jemand kann mir helfen.

Record_2.txt
 Beschreibung:

Download
 Dateiname:  Record_2.txt
 Dateigröße:  54.32 KB
 Heruntergeladen:  332 mal


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 21:48     Titel:
  Antworten mit Zitat      
Ich kann Dir noch viel mehr Nachkommastellen erzeugen Wink
Code:
fprintf('%.30g', 2.231387694374600e+05);
% -> 223138.769437459995970129966736

Die enthalten nur keine zusätzliche Information.
Private Nachricht senden Benutzer-Profile anzeigen
 
Schrank-Senior

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 22:13     Titel: Verwendung von Headerlines
  Antworten mit Zitat      
Hallo Katja,

wie Sirius3 schon korrekt angemerkt hat solltest du bei deinen Daten über eine Differenzbildung vom Ausgangswert nachdenken. Dies sollte die Anzahl der benötigten Stellen deutlich rediuzieren. Desweiteren glaube ich (auch wenn man das ja lieber in der Kirche machen sollte), das f64 auch für deine Daten eine ausreichende Genauigkeit bietet. Diese wird nur nicht angezeigt, da es doch recht unleserlich wird.
Einlesen kannst Du die Daten recht einfach:
Code:
fid = fopen('Record_2.txt','r');
data = textscan(fid,'%f %f %f %f %f %f %f %f %f %f %f %f', 'Headerlines', 15, 'Delimiter', ',');
data2 = textscan(fid,'%u %u %n %n %u %n %n %n %n %n %n %n', 'Headerlines', 2, 'Delimiter',',');
fclose(fid);
 


Grüße Schrank,
der lange nicht mehr hier war und jetzt keinen aktiven Account mehr hat ;-( Oder sich ans ein Passwort nicht mehr erinnert. Smile
 
Katja

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 22:31     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Hilfe. Ich werde die Hinweise am Montag einbauen wenn ich wieder auf Arbeit bin. Ich meld mich, wenn es geklappt hat.
 
Katja

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2013, 13:33     Titel:
  Antworten mit Zitat      
Wie erwartet, hat das Einlesen der Daten wunderbar geklappt. Danke nochmal!

Ich habe aber noch eine Rückfrage zu den Nachkommastellen. Bei den Daten handelt es sich um Rohdaten eines Messgerätes auf deren Erzeugung ich keinen Einfluss habe. Die Zahlen mit den vielen Kommastellen sind Zeitstempel, d.h. für mich sind sie tatsächlich bis zur letzten Stelle nach dem Komma relevant.

Beispielzahl in der Textdatei: 223138.76943745999597

-> Einlesen wie vorgeschlagen und Ausgabe mit
Code:
fprintf('%.30g',Beispielzahl);


Beispielzahl in matlab: 223138.76943746

Frage: Wo sind die letzten 6 Stellen? Werden sie nicht angezeigt, oder sind sie nicht da? Falls sie nicht da sind: Ich brauche sie, was kann ich tun?
 
Katja

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2013, 14:44     Titel:
  Antworten mit Zitat      
Wie erwartet funktioniert das Einlesen der Daten wunderbar. Danke nochmal!

Ich habe aber noch eine Rückfrage bezüglich der Nachkommastellen. Bei den Daten handelt es sich um Rohdaten eines Messgerätes auf deren Erstellung ich keinen Einfluss habe. Die Zahlen mit den vielen Nachkommastellen sind Zeitstempel, d.h. für mich sind tatsächlich alle Nachkommastellen von Interesse.

Beispielzahl in Textdatei: 223138.76943745999597

Einlesen wie vorgeschlagen und Ausgabe mit
Code:
fprintf('%.30g',Beispielzahl)


Beispielzahl in Matlab: 223138.76943746

Frage: Wo sind die Fehlenden Kommastellen? Werden sie nicht angezeigt oder sind sie gar nicht da? Falls letzteres der Fall ist: Ich brauche diese Stellen, was kann ich tun?
 
reichkrystofski
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 26.11.13
Wohnort: Biederitz
Version: 2006b 32bit, 2009b 64bit
     Beitrag Verfasst am: 02.12.2013, 15:17     Titel:
  Antworten mit Zitat      
Ich befürchte, Matlab kann die Zahl tatsächlich nicht in einem double erfassen. Die Genauigkeit von double entspricht wie oben erwähnt einem Float 64, also 64 Bit in denen Vorzeichen, exponent und der Koeffizient untergebeacht sein müssen (Format: +/- Koeffizient *10^exponent).
Man kann meines Wissens etwa 16 dezimalstellen damit darstellen, wobei unabhängig ist, an welcher Stelle das Komma steht. Daher der Vorschlag, vorher eine Differenz zu bilden um die Vorkommastellen loszuwerden (was das Messgerät machen müsste).
Informiere dich, ob du die Stellen wirklich brauchst, oder ob das Messgerät ähnliche Formatierungsbefehle verwendet um die Datei zu schreiben und eigentlich auch nur Float64 verwendet (ein Messgerät hat ja eine bestimmte Messgenauigkeit).
Solltest du die Nachkommastellen wirklich brauchen wirst du wahrscheinlich Vor- und Nachkommastellen in separate Variablen lesen müssen.
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 02.12.2013, 16:10     Titel:
  Antworten mit Zitat      
Mich würde interessieren was das für ein Zeitstempel ist? Sekunden? Millisekunden?
Du kannst es als String einlesen und mit der Symbolic Math Toolbox weiter verarbeiten. Siehe dazu: http://www.mathworks.de/de/help/symbolic/vpa.html
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Katja

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.12.2013, 11:59     Titel:
  Antworten mit Zitat      
Das Einlesen der Zahlen als String funktioniert. Vielen Danke für den Hinweise. Ich habe das erste mal hier im Forum eine Frage gestellt (vorher nur gelesen) und bin absolut überrascht, wie schnell meine Fragen beantwortet wurden. Klasse!

Bei den Zeitstempeln handelt es sich um Zeiten in Sekunden. Die Daten wurden von einem full-waveform Airborne Laserscanningsystem erfasst und werden dort eigentlich binär abgespeichert.
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.