Verfasst am: 15.09.2010, 12:03
Titel: Spalten von einer *.txt-Datei in Matlab importieren
Hallo liebe Matlab-Gemeinde,
ich habe eine Reihe von *.txt-Dateien mit einer unterschiedlichen Spaltenanzahl. Diese *.txt-Datein würde ich aber gerne in Matlab einlesen, und zwar so, dass Matlab die Anzahl der Spalten selbstständig erkennt.
Also in den besagten *.txt-Datein steht immer in der ersten Zeile sowas wie z.b. Strom, Spannung, Zeit usw., und in den darauffolgenden Zeilen stehen immer Zahlenwerte.
Bis jetzt hatte ich immer eine feste Anzahl an Spalten und da habe ich die Daten dann immer mit
[name1, name2, name3....]=textread('*.txt','%n%f%n%s','delimiter','headerlines',1)
importiert.
Dies würde jetzt dann aber nicht mehr funktionieren, da der Aufwand viel zu groß wäre das jedesmal auf eine neue *.txt-Datei anzupassen.
Noch ein Frage ist, ob Matlab auch die jeweilige Spaltenbezeichnung wie z.b. Strom auch selbsständig erkennen könnte, denn die Vorgehensweise mit name1........ wird auch nicht mehr gehen.
Also zusammengefasst:
1) würde mich der Import von beliebig vielen Spalten interessieren
2) würde mich interessieren ob der Spaltenname gleich mitübernommen werden kann
vielen Dank für deine schnelle Antwort.
importdata hat mir sehr geholfen!
Nun hat sich aber ein neues Problem aufgetan, und zwar gibt es in Matlab mit der letzten Spalte ein Problem das ist aber nicht schlimm, da ich diese nicht brauche.
Jetzt ist meine Frage
a) kann ich das ganze so automatisieren, dass mir die Spalte bei jeder Messdatei automatisch gelöscht wird
b) oder sollte ich das ganze lieber so automatisieren, dass es mir alles bis auf die letzte Spalte kopiert und in eine neue *.txt-Datei einfügt.
Wie könnte ich das am besten realisieren, hat da jemand einen Vorschlag?
poste doch mal einen Auschnitt von dem Code, den du bisher hast.
Vielleicht kann man da mit einem ganz einfachen Zwischenschritt die letzte Spalte eliminieren.
als ich vorhin meine *.csv-Datei durchgeschaut habe ist mir aufgefallen, dass die letzte Spalte doch ganz interessant ist, weil sie mir angibt bei welchem Schritt sich gerade die aktuelle Messung befindet.
Das Problem ist aber, dass in der gesamten Spalte nur Text steht, und jetzt macht die Funktion importdata() Probleme.
Jetzt ist meine Frage ob ich diese Spalte verwendbar machen kann, sodass ich diese Spalte auch mit importdata() importieren kann.
da ich einfach mit der letzten Spalte in meiner Messung die *.txt-Datei nicht öffnen bzw. zur Auswertung verwenden kann, lade ich einfach mal eine Messung hoch.
Da hast du recht. Mit sowas ist importdata schnell überfordert. Da hilft nur es selbst zu machen.
Naja, so auf die Schnelle könnte das funktionieren. Geht aber sicherlich eleganter!
% Split by ';' and get number of columns
data.columns = regexp(line, ';', 'split');
numberOfColumns = length(data.columns);
% Prepare for data reading
lineCount = 0;
data.values = {};
% Walk through the file line by line whileischar(line) % Take next line
lineCount = lineCount + 1;
line = fgetl(fid);
% Spilt measured values
items = regexp(line, ';', 'split');
%% REPLACE ',' WITH '.' FIRST!
% Store values (exclude last column)
data.values(lineCount, :) = {cell2mat(cellfun(@str2num, items(1:numberOfColumns-1), 'UniformOutput', 0))};
% Store last column
data.step(lineCount, :) = {items(numberOfColumns)};
end
Also auf Anhieb nicht. Da musst du bzw. die Fehlerbeschreibung schon etwas genauer werden.
Setz mal auf die Zeile eine Breakpoint und lass das Skript laufen. Wenn er an der Zeile anhält gib mal in der Matlab-Kommandozeile "line" ein und lass den Inhalt der Zeile ausgeben.
ann kannst du per Einbabe von "data" bzw. "data.columns" mal angucken, wie deine Struktur bzw. das Feld aussieht.
Wir müssen uns mal da rantasten. Ich hab zwar ein paar Vermutungen, aber wir sehen mal...
Führe mal die folgenden Zeilen aus und poste mal die Ausgabe:
line =
Time, s;Temp, °C;Strom, A;Spannung, V;entladen_1, As;entladen_2, As;laden_1, As;laden_2, As;Test step
??? Error using ==> regexp
Invalid option for regexp: split.
Error in ==> michai3 at 4
regexp(line, ';', 'split')
wenn ich den letzen code mit regexprep mach dann kommt:
line =
Time, s;Temp, °C;Strom, A;Spannung, V;entladen_1, As;entladen_2, As;laden_1, As;laden_2, As;Test step
ans =
Time, ssplitTemp, °CsplitStrom, AsplitSpannung, Vsplitentladen_1, Assplitentladen_2, Assplitladen_1, Assplitladen_2, AssplitTest step
data =
columns: [1x134 char]
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.