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

Problem mit textscan

 

AAA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2014, 15:48     Titel: Problem mit textscan
  Antworten mit Zitat      
Hallo Zusammen,

ich habe ein Problem mit dem Einlesen einer Textdatei (Die ähnlichen Beiträge habe ich bereits durchgeschaut, fand aber nichts, was mich weiter bringen könnte).
Die Datei ist wie folgt strukturiert: es sind insgesamt 18 Spalten, manche Spalten mit Text, andere mit Zahlen oder Daten. Die erste Zeile enthält Spaltennamen, die restlichen Zeilen haben alle gleiche Struktur. Das Trennzeichen ist TAB.

Folgendes wurde bereits versucht:

data = textscan(fid, [repmat('%s',1,18) '%*[^\n]'], 'headerlines', 1, 'delimiter', '\t');

data = textscan(fid, repmat('%s',1,18), 'headerlines', 1, 'delimiter', '\t');

Das Ergebnis: Die Spalten in "data" enthalten zwar die richtige Anzahl der Einträge, alle Einräge sind aber '' also die Inputdaten wurden nicht übernommen.

Mit fread(fid, '*char') wird die Datei zwar eingelesen, bei einer umfangreichen Datei mit mehr als 300.000 Zeilen bekomme ich die Fehlermeldung "Out of Memory". Dies ist der Grund, für die Suche nach einem anderen Weg für den Import.

Vielen Dank

Gruß

AAA

PS: Die Inputdatei darf nicht in mehrere Dateien zerlegt werden.


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.02.2014, 16:40     Titel:
  Antworten mit Zitat      
hallo. bitte benutze die code umgebung wenn du code postest. bei solchen problemen bietet es sich immer an einen beispieldatensatz zur verfügung zu stellen und den entsprechenden lauffähigen code der den fehler reproduziert.
grüße winkow
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
AAA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2014, 17:17     Titel:
  Antworten mit Zitat      
Hallo,

danke für den Hinweis. Die Testdatei ist aus irgendeinem Grund
nicht erschienen.

Der Code sieht so aus:

Code:

function testImport()
fid = 'Testdatei.csv';
data = textscan(fid, repmat('%s',1,18), 'headerlines', 1, 'delimiter', '\t');
end
 


Das Hochladen der Datei klappt nicht so gut, also hier ist der Text:

[text]
a b c d
125A N North America 10
6FRF N Western Europe 72
97QY N North America 302
[\text]

Gruß

AAA
 
AAA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2014, 17:21     Titel:
  Antworten mit Zitat      
PS:
Code:
bitte als
Code:
verstehen.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.02.2014, 17:32     Titel:
  Antworten mit Zitat      
hallo du benutzt fid falsch.
bitte guck dir noch einmal die doc zu textscan an Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
AAA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2014, 17:42     Titel:
  Antworten mit Zitat      
Den code habe ich falsch dargestellt, so würde das Programm gar nicht durchlaufen, sorry. So ist richtig:
Code:

filename = 'Testdatei.csv';
fid  = fopen(filename);
data = textscan(fid, [repmat('%s',1,4) '%*[^\n]'], 'headerlines', 1, 'delimiter', '\t');
 
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.02.2014, 17:56     Titel:
  Antworten mit Zitat      
kann den fehler nicht nachstellen. bei mir liefert es das gewünschte ergebniss
Zitat:
Das Hochladen der Datei klappt nicht so gut, also hier ist der Text:
zippen hilft meist
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
AAA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2014, 10:08     Titel:
  Antworten mit Zitat      
Super, es hat funktioniert, die Datei ist jetzt im Anhang.
Nochmal der Code:
Code:

filename = 'Testdatei.csv';
fid  = fopen(filename);
data = textscan(fid, [repmat('%s',1,4) '%*[^\n]'], 'headerlines', 1, 'delimiter', '\t');
data{:}
 


Das Ergebnis sieht bei mir so aus:

[result]
ans =

''
''
''


ans =

''
''
''


ans =

''
''
''


ans =

''
''
''
[/result]

Vielleicht liegt es an meiner Version von Matlab (R2008b)?

Testdatei.zip
 Beschreibung:

Download
 Dateiname:  Testdatei.zip
 Dateigröße:  263 Bytes
 Heruntergeladen:  267 mal
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 07.02.2014, 10:32     Titel:
  Antworten mit Zitat      
so jetzt... also weis nicht was das für ein format ist. der delemitter tap geht jedenfalls nicht. siht man auch sehr leicht wenn man einmal die datei als text in matlab öffnet. csvread geht auch nicht da csvread für komma getrennte werte ist. wenn du textscan benutzen willst musst du alles einlesen. ich würde allerdings xlsread benutzen
Code:
[~,~,raw]=xlsread('Testdatei.csv')

edit:
2008 version ist der ~ operator glaube ich noch nicht vorhanden für diese art der benutzung. guck dazu am besten in der doc zu xlsread nach. im notfall musst du dir die anderen beiden parameter auch zurückgeben lassen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
AAA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2014, 11:16     Titel:
  Antworten mit Zitat      
xlsread funktioniert zwar, liest aber nur 65536 Zeilen ein. Dies liegt wahrscheinlich an meinem Matlab R2008b.

Trotzdem vielen, vielen Dank für Deine Unterstützung.
Sollte Dir eine weitere Alternative einfallen, poste die, bitte, auch.

Viele Grüße

AAA
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.02.2014, 14:27     Titel:
  Antworten mit Zitat      
Hallo das Problem liegt in der Codierung des Textfiles, das ist als UTF-16 codiert. Dieses Format wird von Matlab aber nicht unterstützt

Versuche mal folgendes, dem FOPEN explizit das Format mitteilen.
Du kriegst zwar eine Warnung, aber das sollte funktionieren:
Versuche bitte aber zuerst mit deinem kleinen Beispiel-Datensatz
Code:

filename = 'Testdatei.csv';
fid  = fopen(filename,'rt+','l','UTF-16');
data = textscan(fid, '%s%s%s%s', 'headerlines', 1, 'delimiter', {'\t','\n'},'CollectOutput', true)
fclose(fid)
data{:}
 
Private Nachricht senden Benutzer-Profile anzeigen
 
AAA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2014, 15:42     Titel:
  Antworten mit Zitat      
Hallo Denny,

danke für Deinen Vorschlag, das Ergebnis hat sich leider kaum verändert.

[result]

ans =

'' '' '' ''
'' '' '' ''
'' '' '' ''

[/result]
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.02.2014, 16:24     Titel:
  Antworten mit Zitat      
Hallo

wie gesagt das liegt an dem Format deiner Textdatei, ich habe in 2009a ausprobiert, dort scheitert TEXTSCAN gänzlich am Einlesen,
sogar textscan(fid, '%s') was eigentlich bedeutet das Text ganz einzulesen, funktioniert nicht.
In 2013b läuft das oberer Code ohne Probleme.

Also müssen wir einen Umweg machen und zwar die Datei ganz über FREAD einlesen:
Code:

fid   = fopen(filename,'rt+','l','UTF-16');
data = fread(fid,'*char')';
fclose(fid)
data = textscan(data, '%s%s%s%s', 'headerlines', 1, 'delimiter', '\t','CollectOutput', true)

data{:}

 



oder so:

Code:

fid   = fopen(filename,'rt+','l','UTF-16');
data = fread(fid,'*char')';
fclose(fid)
data = regexp(data,'\n','split')
data = regexp(data,'\t','split')
data = cat(1, data{:})

 
Private Nachricht senden Benutzer-Profile anzeigen
 
AAA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2014, 17:19     Titel:
  Antworten mit Zitat      
Hallo Denny,

die Funktion FREAD habe ich auch in meinem Code, bis das Matlab an seine Grenze gestoßen ist, benutzt. Meine Inputdatei ist mit der Zeit größer geworden, deswegen suche ich nach alternativen Importmethoden.

Eine Lösung, die ich bis jetzt habe: die Inputdatei mit dem MS Access einlesen, danach direkt als eine CSV-Datei exportieren.
Die auf diese Weise modifizierte Datei kann mit TEXTSCAN vom Matlab importiert werden. Ein weiterer positiver Nebeneffekt: die modifizierte Datei ist dann nur halb so groß.

Gruß

AAA
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.02.2014, 17:50     Titel:
  Antworten mit Zitat      
Ach so, das mit FREAD und der Größe der Datei habe ich überlesen,

Wenn die Größe der Inputdatei weiter steigt, wird auch TEXTSCAN irgendwann an die Grenzen stoßen.
In diesem Fall wird man wohl nicht rumkommen, Zeilenweise oder Blockweise in der Schleife die Datei einlesen. Also mit FGETL oder mit FREAD oder auch mit TEXTSCAN.


PS: Wegen des falsches Einleseformats, war deine Daten in der Größe künstlich aufgebläht, zwischen jedem Zeichen kommen extra Leerzeichen, deswegen kam beim FREAD Out of Memory
Private Nachricht senden Benutzer-Profile anzeigen
 
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.