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

Daten einlesen für bestimmte Spalten

 

mathphys
Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 06.08.2011, 15:48     Titel: Daten einlesen für bestimmte Spalten
  Antworten mit Zitat      
Hallo

bis jetzt hatte ich eine Textdatei, die aus vier Spalten bestand. Die erste Spalte hatte einen Buchstaben und die drei danach Zahlen. Der Code zum einlesen war:

Code:

fid = fopen('Datei');
data = {};
while ~feof(fid)
    l = fgetl(fid);
    if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')
        data = [data; textscan(l, '%s %f %f %f')];
    end
end
fclose(fid);

data(:,1)=[]
FAD_geo=double(cell2mat(data))


Von nun an habe ich Dateien, die sehr viele Spalten mehr haben, die auch anders aufgeteilt sind. In der ersten Spalte ist wieder ein Buchstabe (was wichtig ist, damit alle Zeilen ignoriert werden, wenn sie nicht mit N oder C anfangen). In der zweiten Spalte eine Information die ich hier (an dieser Stelle) nicht einlesen will und nicht benötige und Spalte drei, vier, fünf sind die Zahlen die ich einlesen will, genau wie vorher. Dahinter sind weitere Spalten, die hier jedoch auch nicht eingelesen werden sollen.

Die Frage ist also, wie ich MATLAB sage, dass nur Spalte 1,3,4,5 betrachtet werden sollen.

Das muss ich am Beispiel meines obigen Codes hinbekommen. Für Hilfe bin ich sehr dankbar.

Viele Grüsse
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen


Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 06.08.2011, 17:00     Titel:
  Antworten mit Zitat      
Hallo,

siehe in die Hilfe von textscan unter "Skipping Fields or Parts of Fields". Das Asterix ist dein Freund:
Code:

Example: '%s %*s %s %s %*s %*s %s' (spaces are optional) converts the string
'Blackbird singing in the dead of night' to four output cells with the strings
'Blackbird' 'in' 'the' 'night'
 


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 06.08.2011, 17:16     Titel:
  Antworten mit Zitat      
So wie ich das verstehe, bedeutet %* das Auslassen einer Spalte.

Ich bekomme aber einen Fehler, wenn ich das hier setze:

Code:
fid = fopen('geo_and_hfc.dat');
data = {};
while ~feof(fid)
    l = fgetl(fid);
    if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')
        data = [data; textscan(l, '%s %* %f %f %f')];
    end
end
fclose(fid);

data(:,1)=[]
FAD_geo=double(cell2mat(data))

_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 06.08.2011, 17:23     Titel:
  Antworten mit Zitat      
Hallo,

also mehr als dir die Textstelle in der Hilfe UND ein Beispiel anzugeben kann ich nicht tun... Hättest du dir das Beispiel mal genau angeschaut, hättest du festgestellt, dass du trotzdem noch den Datentyp mit angeben muss. Also statt

Code:
%* diesen Ausdruck:  %*s


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 06.08.2011, 17:31     Titel:
  Antworten mit Zitat      
Mit %*s bekomme ich aber trotzdem einen Fehler und zwar kritisiert er dann

Code:
data(:,1)=[]


Der Code ist

Code:
fid = fopen('Datei');
data = {};
while ~feof(fid)
    l = fgetl(fid);
    if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')
        data = [data; textscan(l, '%s %*s %f %f %f')];
    end
end
fclose(fid);

data(:,1)=[]
FAD_geo=double(cell2mat(data))


Meine Zweite Spalte die ich nicht will beinhaltet wie gesagt aber Zahlen. Wäre %*s nicht für ein Buchstabe?
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 06.08.2011, 17:49     Titel:
  Antworten mit Zitat      
Hallo,

naja das die 2. Spalte eine Zahl ist kann ich ja nicht wissen, wenn du es nicht explizit angibst (oder ich habe es überlesen, dann sorry) und ein wenig selber mitdenken ist doch auch nicht zuviel verlangt, oder? Wenn es eine Zahl ist dann musst du natürlich das "s" durch ein "d" oder "f" oder was auch immer du möchtest ersetzen.

Ich hatte meine Antwort auch nur auf das Herauslassen der Spalte bezogen und den Rest deines Codes nicht weiter betrachtet. Schau dir dochcmal "data" an der Fehlerstelle im Debugger an und dann wirst du denke ich sehen warum der Fehler auftaucht.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 06.08.2011, 17:58     Titel:
  Antworten mit Zitat      
Es wird mir nicht angezeigt was der Fehler ist, sondern es wird nur das gesagt, was ich oben zitiert habe.

Ich denke mit so gut ich kann! Ich bin noch immer ein totaler Neuling in der Programmierwelt, sonst würde ich solche Fragen wohl nicht stellen und wenn ich dann etwas nicht erkenne, weil ich nicht auf Erfahrung zurückgreifen kann, dann wirf mir nicht mangelndes mitdenken vor...

data(:,1)=[] bedeutet doch, dass ich die erste Spalte lösche. Das soll jetzt ja auch sein, weil die erste Spalte die Buchstaben sind, die benötigt wurden um zu charakterisieren, welche Zeilen genutzt werden und welche nicht.

Ich weiss nicht wo das Problem liegt Sad

(Im übrigen steht in der Eingangsfrage, dass Spalte zwei eine nicht benötigte Zahl ist, aber kein Problem)

Gruß
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.08.2011, 18:21     Titel:
  Antworten mit Zitat      
Hallo,

bitte nochmal den gesamten Code und am besten auch ein Beispiel der Datei angeben. Vielleicht seh ich's ja nur nicht, aber zu sagen, dass MATLAB "etwas kritisiert" ist für mich kein vernünftiges Zitat der Fehlermeldung Wink

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 06.08.2011, 18:37     Titel:
  Antworten mit Zitat      
Hallo,

entschuldigung ich wollte dich natürlich nicht persönlich angreifen, falls das so rüberkam.

Also dein Problem muss an deiner Datei liegen, da dein Code mit meiner Beispieldatei funktioniert (siehe Anhang):
Code:

fid = fopen('Datei.txt');
data = {};
while ~feof(fid)
    l = fgetl(fid);
    if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')
        data = [data; textscan(l, '%s %*f %f %f %f')];
    end
end
fclose(fid);

data(:,1)=[]
FAD_geo=double(cell2mat(data))
 


MFG

Sco

Datei.txt
 Beschreibung:

Download
 Dateiname:  Datei.txt
 Dateigröße:  43 Bytes
 Heruntergeladen:  350 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 06.08.2011, 20:15     Titel:
  Antworten mit Zitat      
Die Fehlermeldung die jetzt angegeben wird ist:

Code:
??? Matrix index is out of range for deletion.

data(:,1)=[]


Der Code von Sco ist identisch mit meinem, daher ja, es muss an meiner Datei liegen?

Ein Beispiel des Inhalts habe ich hier.

Beim hochladen kam vom Forum das Fehler, dass .dat Dateien nicht hoch geladen werden dürfen. Daher hier als Textdatei:

Gruß

Beispiel.txt
 Beschreibung:

Download
 Dateiname:  Beispiel.txt
 Dateigröße:  704 Bytes
 Heruntergeladen:  355 mal

_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 06.08.2011, 20:42     Titel:
  Antworten mit Zitat      
Hallo,

das ist genau was ich in meinem vorherigen Postings meinte. Wenn du den Debugger Modus genutzt und dir deine "daten" an der Stelle:
Code:

data(:,1)=[]
 

angeschaut hättest, dann hättest du gemerkt, dass "data" an dieser Stelle leer ist. Daher auch der Fehler von Matlab. Das Problem sind Leerzeichen vor deinem ersten Buchstaben, so dass dein Suche nach den Buchstaben "N" oder "C" immer fehlschlägt und somit auch der textscan Befehl nie aufgerufen wird. Ändere einfach die Zeile mit "fgetl" folgendermassen um alle Leerzeichen am Begin und Ende zu entfernen:
Code:


So nun sollte es aber klappen Smile.

PS: und wie Harald schon sagte ist eine genaue Angabe der Fehlermeldung ist sehr hilfreich, schon dadurch wusste ich nämlich, dass data leer sein muss und das wohl der textscan Befehl gar nicht aufgerufen wird.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 06.08.2011, 20:49     Titel:
  Antworten mit Zitat      
Bedeutet "Debugger" nicht der Fehler der im MATLAB Fenster ausgegeben wird?

Erkläre mir bitte was du meinst. Ich kenne das nicht.

Oh Gott, was ist jetzt passiert?

Mein Code und das Ergebnis:

Code:
fid = fopen('Datei');
data = {};
while ~feof(fid)
    l = strtrim(fgetl(fid));
    if strcmpi(l(1), 'N') || strcmpi(l(1), 'C')
        data = [data; textscan(l, '%s %*f %f %f %f')];
    end
end
fclose(fid);

data(:,1)=[]
FAD_geo=double(cell2mat(data))


Code:
data =

    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]
    [4x1 double]    [3x1 double]    [3x1 double]

??? Error using ==> cat
CAT arguments dimensions are not consistent.

Error in ==> cell2mat at 92
        m = cat(2,m{:});

Error in ==> FAD_A_tensor_representation at 31
FAD_geo=double(cell2mat(data))


Sad Confused
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 06.08.2011, 21:07     Titel:
  Antworten mit Zitat      
Hallo,

wenn du deinen Code in eine Funktion schreibst und diese abspeicherts dann kannst du im Editor an der linken Seite rote Punkte setzen, wo der Code anhalten soll. Dann kannst du dir den Inhalt der bis dahin erzeugten Variablen anschauen. Ansonsten bitte einfach mal googeln.

Der Fehler besagt das die Dimensionen der Zellen in "data" nicht gleich sind. Du hasst ja 4x1 und 3x1 Zellen mit doubles. Deshalb kannst du cell2mat nicht direkt auf die ganze Variable "data" anwenden, sondern musst dies einzeln für jede Zelle machen. Eine Lösung wäre z.B. dies:
Code:

FAD_geo = arrayfun(@(x) cell2mat(x),data,'uni',0);
 


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.08.2011, 21:08     Titel:
  Antworten mit Zitat      
Hallo,

das Problem waren die darauffolgenden Spalten. Die einfachste Möglichkeit ist, das Einleseformat nur einmal anzuwenden:

Code:
data = [data; textscan(l, '%s %*f %f %f %f', 1)];


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.08.2011, 21:11     Titel:
  Antworten mit Zitat      
Mit einem Debugger kann man das Programm an einer beliebigen Stelle anhalten, in dem man einen Breakpoint setzt (Linksklick auf den - neben der Zeilennummer), um sich dann die Zwischenergebnisse anzuschauen. Diese liegen ebenfalls im Workspace. Am Breakpoint wird das Programm dann angehalten, mit allen bisherigen Daten und du kannst dann mit F10 im Schrittbetrieb fortfahren. So kann man relativ schnell Fehler im Programm finden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.