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

xlsxred automatisch ohne NaN Spalten

 

remix92
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 14:27     Titel: xlsxred automatisch ohne NaN Spalten
  Antworten mit Zitat      
Hallo,

Ich hänge an ein Problem fest, bei dem ich nicht weiterkomme...

Ich importiere Daten aus einem Excel File.
In der Ersten Zeile befinden sich Die Überschriften.
Ab der 2 Zeile Sind die Werte eingetragen.

Ich würde gern nun autoamtisiert Nur Spalten in matlab improtieren, die ab der 2 Zeile Werte Enthalten bzw. keine NaN Spalten sind!!!

Derzeit mach ich das wie folgt:
Code:

 [TestData,header]= xlsread ('Example.xlsx');
 TestData( :, all( isnan( TestData), 1 ) ) = [];
 Titel=header(1,1:end);
 Title= transpose(Titel);
 


Sprich: Die NaN Spalten werden über matlab gelöscht.
Da tritt folgendes Problem auf:
Die Titel werden bzw können nicht automatisch mit gelöscht werden, da das als "Cell Wert" im Workspace hinterlegt ist...

Habt ihr denn eine Lösung für mein problem?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.12.2017, 15:00     Titel:
  Antworten mit Zitat      
Hallo,

du brauchst dir nur zu merken, welche Spalten gelöscht werden:

Code:
[TestData,header]= xlsread ('Example.xlsx');
todelete = all( isnan( TestData), 1 );
TestData( :,  todelete) = [];
Titel=header(1,1:end);
Titel(todelete) = [];
Titel= transpose(Titel);
 


Für tabellarische Daten rate ich generell zu readtable und in diesem Fall ismissing:
Code:
data = readtable('Example.xlsx');
data(:, all(ismissing(data), 1)) = [];


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 15:21     Titel:
  Antworten mit Zitat      
Vielen Dank Smile

Ist es denn möglich, Spalten die Aus "0 Einträgen" bestehen ebenfalls zu löschen und mit NaN zu kombinieren?

Also alle NaN-Spalten und 0-Spalten zu löschen ?


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.12.2017, 15:57     Titel:
  Antworten mit Zitat      
Hallo,

Anpassung für den ersten Ansatz:
Code:
todelete = all( isnan( TestData) | TestData == 0, 1 );


für den zweiten Ansatz:
Code:
data(:, all(ismissing(data, {NaN, 0}), 1)) = []


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 17:52     Titel:
  Antworten mit Zitat      
Vielen Dank Smile

ich hab ein kleines Problem entdeckt...

mein Code sieht nun folgendermaßen aus:
Code:

 [TestData,header]= xlsread ('TestData_Example.xlsx');
todelete = all( isnan( TestData) | TestData== 0, 1 );
TestData( :,  todelete) = [];
Titel=header(1,1:end);
Titel(todelete) = [];
Title= transpose(Titel);
 


Im TestData werden nun dementsprechend Die Spalten mit 0 und NaN Einträgen gelöscht.
Aber die Überschriften werden irgendwie falsch gelöscht...
Erkenne leider kein System dahinter nach welchem Verfahren die Übershriften gelöscht werden.

Aufjedenfall werden einige Überschriften nicht gelöscht, die gelöscht werden sollten, da bei diesen Spalten nur NaN Einträge vorhanden sind...

Woran liegt das bzw. was mach ich falsch ?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 18:44     Titel:
  Antworten mit Zitat      
Ich hab ein wenig den Code umgeschrieben und das Problem eventuell vereinfacht...

Code:

data = readtable('TestData_Example.xlsx');
data(:, all(ismissing(data, {NaN, 0}), 1)) = [];
TestData= table2array(data)
 


Hab dein Tipp mit table zu herzen genommen und es zuerst als table gespeichert und Dann in ein Array umgewandelt um somit für meine Spätere Arbeit voranzukommen.

Kann ich denn auf die Überschriften verweißen, sodass ich z.B Plots mit den jeweiligen Überschriftennamen von data abspeichern kann ?

Allgemein möchte ich mit den Überschriften weiterarbeiten. Aber ich weiß nicht wie Syntax dafür lautet....

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.12.2017, 19:23     Titel:
  Antworten mit Zitat      
Hallo,

Code:
titles = data.Properties.VariableNames;


Was den xlsread-Ansatz angeht: ohne ein reproduzierbares Beispiel kann ich auch nicht sagen, was da schief geht. Es kann z.B. sein, dass headers andere Inhalte hat als du erwartest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2017, 11:33     Titel:
  Antworten mit Zitat      
klappt wunderbar Smile

das mit Header aber ich jetzt ausgelassen und klappt wunderbar !
Ist es denn möglich noch eine Letzte Bedingung mit einzubauen?
Bisher waren die Bedingungen:
1. NaN-Spalten löschen
2. 0-Spalten löschen

Meine zusätzlich gewünschte Bedingung wäre:
3. Spalten zu löschen, die nur Texte enthalten

Wäre Super, wenn das noch möglich wäre Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.12.2017, 19:58     Titel:
  Antworten mit Zitat      
Hallo,

ich vermute mal, dass es gerade um die Tables geht? Bei xlsread wird Text ja zu NaN.

Bei Tables kannst du die Datentypen der Spalten so abfragen und anschließend filtern:
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2017, 15:49     Titel:
  Antworten mit Zitat      
Hi,
genau im table müsste ich die Spalten löschen.

Nun stellt sich heraus, dass es "Cell" Datentypen sind, die gelöscht werden müssen.

Nun hänge ich dran, den Code so umzuschreiben, dass auch alle "Cell" Spalten gelöscht werden...

Code:

TestData(:, all(ismissing(TestData, {NaN, 0,Cells}), 1)) = [];
 


Wäre auch zu einfach wenn das funktionieren würde Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

die Idee war eher, dass du den genannten Befehl verwendest, um den Datentyp jeder Spalte zu bekommen, dann vergleichst, und die Spalten löschst. Also separat von der 0/NaN-Vorgehensweise.

Code:
datatypes = table2cell(varfun(@class, data));
toremove = strcmp(datatypes, 'cell');
data(:, toremove) = [];


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2017, 22:26     Titel:
  Antworten mit Zitat      
Funktioniert super Smile

Ohman eine letzte Frage habe ich noch...

Ist es möglich Spalten mit gewissenen Überschriften zu löschen im table?
der Code zum löschen lautet ja zb so: Spalte "Hallo" wird gelöscht
Code:
data.hallo = [];


Aber wenn diese Spalte nicht existiert, bekomme ich folglicherweiße eine Fehlermeldung.

Ist es denn möglich diese Fehlermeldung zu ignorieren bzw. einfach den befehl zu ignorieren, falls diese Spalte nicht existiert?

Gruß

PS:tut mir leid, dass ich so viele Fragen stelle Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.12.2017, 00:02     Titel:
  Antworten mit Zitat      
Hallo,

du kannst das in einen try-catch Block packen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2017, 13:14     Titel:
  Antworten mit Zitat      
Perfekt vielen Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
ThKo26
Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 11.01.2018, 16:07     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

du brauchst dir nur zu merken, welche Spalten gelöscht werden:

Für tabellarische Daten rate ich generell zu readtable und in diesem Fall ismissing:
Code:
tbl_Settings = readtable ('C:\Users\ThKo\Desktop\Rig.xlsx','Sheet','Output');
tbl_Settings(:,all(ismissing(tbl_Settings, {NaN,''}),2)) = [];


Ich stehe auf dem Schlauch. Ich lösche die Zeilen, aber ich erhalte folgende Fehlermeldung. Ich habe eine Spalte, in der stehen Namen. Bei den zu löschenden Zeilen steht in der Spalte ''.

Code:

Error using Pareto (line 9)
Variable index exceeds table dimensions.

Danke
Grüße,
Harald
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 - 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.