Verfasst am: 06.02.2014, 15:48
Titel: Problem mit textscan
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.
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
_________________
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
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.
_________________
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
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)
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{:})
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ß.
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
Einstellungen und Berechtigungen
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
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.