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

Dateien lesen csvread oder fscanf?

 

dkong
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 24.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2016, 17:51     Titel: Dateien lesen csvread oder fscanf?
  Antworten mit Zitat      
Hallo Leute,
Ich habe Datensätzen vorliegen, die innerhalb der Dateien mit „;" getrennt sind und möchte diese nun einlesen um sie im weiteren Verlauf auswerten zu können.

Bspw.:
173638.48; 2737; 44002; 0; 0; 0; 87
... und das über mehrere hundert Zeilen.

Zunächst dachte ich an die „fscanf" Funktion. Also öffnete ich eine der Dateien mit file1 = fopen('myfile.txt') und wollte anschließend die Daten in eine Matrix einlesen mit A = fscanf(file1, '%f%i%i%i',[inf]);
Dabei bekomme ich als Ergebnis jedoch immer eine 1x1 Matrix - quasi nur eine Zahl und zwar den allerersten Eintrag des Datensatzes, mit nur einer Nachkommastelle.
Nun versuchte ich es mit csvread: X = csvread('myfile.txt')
Immerhin erhielt ich dabei alle Zeilen des Datensatzes, jedoch nur die erste Spalte und auch nur mit einer Nachkommastelle.

Kann mir jemand helfen? Was mach ich falsch?

Vielen Dank im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


AndyydnA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2016, 09:59     Titel:
  Antworten mit Zitat      
csvread verwendet (wie der Name schon sagt) ein Komma als Trennzeichen. Da du ein Semikolon hast, kannst du dlmread verwenden:

Code:

X = dlmread('myfile.txt', ";")
 
 
dkong
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 24.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2016, 10:28     Titel:
  Antworten mit Zitat      
Vielen Dank!

Nun ist es aber so: Wenn ich die Daten nun mit dlmread einlese, erhalte ich eine eigentümliche Interpretation der Daten, die in den Files stehen.

>> file1 = fopen('911-luderitz.txt');
>> X = dlmread('911-luderitz.txt', ";")
X =

   1.9586e+03   1.4970e+03   0.0000e+00   0.0000e+00
   1.9587e+03   1.5030e+03   0.0000e+00   0.0000e+00
   1.9588e+03   1.5160e+03   0.0000e+00   0.0000e+00


In der ersten Spalte stehen Bpw. Jahreszahlen. Richtig wäre hier also: 1958.6250
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.11.2016, 11:49     Titel:
  Antworten mit Zitat      
Hallo dkong,

Beim fscanf müsstest Du wahrscheinlich einfach nur das Semicolon mit angeben:
Code:


"1.9586e+03" ist die wissenschaftliche Darstellung der Zahl 1958.6250. Sie bedeutet: 1.9586 * 10^(+3). In Matlab kann man die Darstellung im CommandWindow mit dem format Befehl einstellen. Wie das bei Octave funktioniert, weiß ich nicht. Grundsätzlich ändert das aber nichts an den Inhalten der Variablen, sondern nur die Darstellung als Text. Du bekommst aklso auch jetzt schon das gewünschte Ergebnis. Bei Bedarf kannst Du die Zahlen per fprintf genau so ausgeben, wie Du es möchtest.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dkong
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 24.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2016, 15:00     Titel:
  Antworten mit Zitat      
Vielen Dank schonmal!

Wenn ich es mit fscanf mache, bekomme ich allerdings immer nur vier Zeilen und das ist bei mehreren hundert nicht so hilfreich.

Mit fprint("%4.4f; %d; %d; %d\n", fid) komme ich aber immerhin zur fast gewünschten Ausgabe.

Edit: Bei dlmread scheint Octave die Daten nicht spaltenweise einzulesen, sondern erfasst alle Daten ohne Trennung in vier Spalten. Auch wenn ich es um C = dlmread('fid', "%4.4f; %d; %d; %d"); erweitere, komme ich nicht zum gewünschten Ergebnis, denn dann erzeugt Octave eine Vx13-Matrix.
Private Nachricht senden Benutzer-Profile anzeigen
 
foobar

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2016, 20:20     Titel:
  Antworten mit Zitat      
In deinem zweiten Posting hattest du doch schon die Lösung mit dlmread, allerdings hast du wegen wissenschaftlicher Notation nicht erkannt, dass es die Lösung ist.
 
dkong
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 24.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2016, 22:37     Titel:
  Antworten mit Zitat      
Meine Idee war es jetzt, die Zahlen in dem von mir gewünschten Format auszugeben. Das scheint aber irgendwie mit keinem der mir gängigen Methoden zu funktionieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
foobar

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2016, 22:47     Titel:
  Antworten mit Zitat      
Dazu musst du einmal erklären, was denn die gewünschte Ausgabe ist. Außerdem musst du zwischen einlesen mit dlmread, der internen Darstellung als float und der Ausgabe unterscheiden.
 
dkong
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 24.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2016, 13:06     Titel:
  Antworten mit Zitat      
Ich hätte die Ausgabe gern in dieser Form: 2000.8750; 1510; 0;000

Im Idealfall werden sogar direkt beim Einlesen die Defaultwerte im Datensatz nicht mit eingelesen. Diese finden sich immer in der zweiten Spalte und haben den Wert -55555.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.11.2016, 13:59     Titel:
  Antworten mit Zitat      
Hallo dkong,

Es ist schwierig auf Deine Mitteilungen konkret zu antworten.

Zitat:
Ich hätte die Ausgabe gern in dieser Form: 2000.8750; 1510; 0;000

Dann poste, was Du bisher versucht hast und stelle eine konkrete Frage dazu.

Zitat:
Im Idealfall werden sogar direkt beim Einlesen die Defaultwerte im Datensatz nicht mit eingelesen. Diese finden sich immer in der zweiten Spalte und haben den Wert -55555.

"Nicht miteinlesen" ist nicht möglich. Aber Du kannst die gewünschten Daten entfernen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dkong
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 24.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2016, 16:29     Titel:
  Antworten mit Zitat      
Was ich dazu schon konkret unternommen habe, schilderte ich bereits weiter oben.
Wenn ich es via fscanf versuche, bekomme ich die Datei immer nur bis einschließlich der vierten Zeile eingelesen und auch nur die erste Spalte.
Konkret versuchte ich es mit: >> C = fscanf(file1, '%f;', inf);

Danach nahm ich den Rat bezüglich dlmread an. Konkret mit:
>> A = dlmread('myfile.txt', ";");
Da liest es die Daten offenbar korrekt ein. Um diese aber nicht wissenschaftlich, sondern für meine Zwecke dienlicher darzustellen, folgte ich Deinem Rat über fprintf.
Konkret hieß das: >> fprintf('%4.4f; %d; %d; %d', A)
Und an der Stelle wird alles durcheinander gewürfelt.
Private Nachricht senden Benutzer-Profile anzeigen
 
foobar

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2016, 21:26     Titel:
  Antworten mit Zitat      
Es ist echt langwierig zu erkennen, was du nun willst. Anhand deinen Daten oben, habe ich eine Datei myfile.txt erstellt mit folgendem Inhalt:

Zitat:

2000.8750; 1510; 0;000
2001.8751234; 1520; 0;000


Nun einlesen wie oben geschrieben und mit fprintf RICHTIG formatieren:

Code:

A = dlmread("myfile.txt", ";");
fprintf ("%.4f; %d; %d; %03d\n", A')
 


ergibt als AUsgabe:

Zitat:

2000.8750; 1510; 0; 000
2001.8751; 1520; 0; 000


Siehe die Änderung mit fprintf, die %03d kommt auch aus deiner Anforderung, dass in der letzten Spalte "000" angezeigt werden soll
 
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 - 2024 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.