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

>> txt- richtig schreiben + einlesen

 

stoxxii

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2018, 10:26     Titel: >> txt- richtig schreiben + einlesen
  Antworten mit Zitat      
Halloo User-Gemeinde,
Halloo Admins,

ich habe im Anhang meine Daten gesammelt, die ich bei der UNI auf dem Ruder-Ergometer so abgeleistet habe ...

Ich dachte, wenn ich die Spalten mit Tabulator trenne, anstatt mit Komma,
dann würde das auch korrekt sein... und dürfte beim Einlesen keine Probleme
verursachen... Aber falsch gedacht ...
ich bekomme die Daten nur als Cell Array rein, unzwar mit importdata ...
und dann kann in das Cell Array nicht separat auf die Spalten drauf zugreifen ..

Würdet ihr mir bzgl. Erstellen solcher Daten in eine txt-Datein ein Tip geben ??
und vielleicht noch ein, wie ich diese txt-Datei mit textrad, dlmread oder importdata oder auch fscanf richtig einlesen könnte bzw. wie ich mein Cell Array auflöse ?? Wink

Danke vorab ...
beste Grüße
stoxxii

RudernUwe.txt
 Beschreibung:

Download
 Dateiname:  RudernUwe.txt
 Dateigröße:  3.39 KB
 Heruntergeladen:  189 mal


uzcyi
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 66
Anmeldedatum: 22.12.15
Wohnort: Nähe Pforzheim
Version: ---
     Beitrag Verfasst am: 11.06.2018, 16:18     Titel:
  Antworten mit Zitat      
Hallo stoxxii,

funktioniert doch Einwandfrei hier der automatisierter Skript:

diese Codezeile musst du nur anpassen:
Code:
filename = 'X\X\X\X\RudernUwe.txt'; % hier Pfad noch eingeben



Code:
%% Import data from text file.
% Script for importing data from the following text file:
%% Initialize variables.
filename = 'X\X\X\X\RudernUwe.txt'; % hier Pfad noch eingeben
delimiter = '\t';
startRow = 2;
endRow = 92;
%% Read columns of data as text:
% For more information, see the TEXTSCAN documentation.
formatSpec = '%s%s%s%s%s%s%s%s%[^\n\r]';
%% Open the text file.
fileID = fopen(filename,'r');
%% Read columns of data according to the format.
% This call is based on the structure of the file used to generate this
% code. If an error occurs for a different file, try regenerating the code
% from the Import Tool.
dataArray = textscan(fileID, formatSpec, endRow-startRow+1, 'Delimiter', delimiter, 'TextType', 'string', 'HeaderLines', startRow-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
%% Close the text file.
fclose(fileID);
%% Convert the contents of columns containing numeric text to numbers.
% Replace non-numeric text with NaN.
raw = repmat({''},length(dataArray{1}),length(dataArray)-1);
for col=1:length(dataArray)-1
    raw(1:length(dataArray{col}),col) = mat2cell(dataArray{col}, ones(length(dataArray{col}), 1));
end
numericData = NaN(size(dataArray{1},1),size(dataArray,2));
for col=[1,3,4,5,6,7]
    % Converts text in the input cell array to numbers. Replaced non-numeric
    % text with NaN.
    rawData = dataArray{col};
    for row=1:size(rawData, 1)
        % Create a regular expression to detect and remove non-numeric prefixes and
        % suffixes.
        regexstr = '(?<prefix>.*?)(?<numbers>([-]*(\d+[\,]*)+[\.]{0,1}\d*[eEdD]{0,1}[-+]*\d*[i]{0,1})|([-]*(\d+[\,]*)*[\.]{1,1}\d+[eEdD]{0,1}[-+]*\d*[i]{0,1}))(?<suffix>.*)';
        try
            result = regexp(rawData(row), regexstr, 'names');
            numbers = result.numbers;
           
            % Detected commas in non-thousand locations.
            invalidThousandsSeparator = false;
            if numbers.contains(',')
                thousandsRegExp = '^\d+?(\,\d{3})*\.{0,1}\d*$';
                if isempty(regexp(numbers, thousandsRegExp, 'once'))
                    numbers = NaN;
                    invalidThousandsSeparator = true;
                end
            end
            % Convert numeric text to numbers.
            if ~invalidThousandsSeparator
                numbers = textscan(char(strrep(numbers, ',', '')), '%f');
                numericData(row, col) = numbers{1};
                raw{row, col} = numbers{1};
            end
        catch
            raw{row, col} = rawData{row};
        end
    end
end
%% Split data into numeric and string columns.
rawNumericColumns = raw(:, [1,3,4,5,6,7]);
rawStringColumns = string(raw(:, [2,8]));
%% Make sure any text containing <undefined> is properly converted to an <undefined> categorical
idx = (rawStringColumns(:, 2) == "<undefined>");
rawStringColumns(idx, 2) = "";
%% Create output variable
RudernUwe = table;
RudernUwe.No = cell2mat(rawNumericColumns(:, 1));
RudernUwe.Date = rawStringColumns(:, 1);
RudernUwe.Distance = cell2mat(rawNumericColumns(:, 2));
RudernUwe.Time = cell2mat(rawNumericColumns(:, 3));
RudernUwe.SproM = cell2mat(rawNumericColumns(:, 4));
RudernUwe.Watt = cell2mat(rawNumericColumns(:, 5));
RudernUwe.Kalorien = cell2mat(rawNumericColumns(:, 6));
RudernUwe.VSPLuer = categorical(rawStringColumns(:, 2));
%% Clear temporary variables
clearvars filename delimiter startRow endRow formatSpec fileID dataArray ans raw col numericData rawData row regexstr result numbers invalidThousandsSeparator thousandsRegExp rawNumericColumns rawStringColumns idx;


Du erhälst die Daten in table-format und die Spalten kannst du entweder mit


Code:
RudernUwe.No(1)  % 1.Spalte No
RudernUwe.No(:)  % 1.Spalte No
RudernUwe.Date(5) % 2.Spalte Date


oder

Code:
RudernUwe{1,1}  % RudernUwe.No(1) als Array zugreifen
RudernUwe{:,1}  % RudernUwe.No(: )  als Array zugreifen
RudernUwe(5,2)  % RudernUwe.Date(5)


aufrufen.
Cell-Array transformiert man mit der Funktion cell2mat:
Code:
A = {1}  % A ist ein 1×1 cell array
a = cell2mat(A) % a ist ein 1×1 array


Weitere Cell-Array Transformationen findest du hier https://www.mathworks.com/help/matlab/ref/cell2mat.html?s_tid=srchtitle

Grüße uzcyi
Private Nachricht senden Benutzer-Profile anzeigen
 
stoxxii

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2018, 16:36     Titel: >> frage zu Cellarray via importdate
  Antworten mit Zitat      
Halloo uscyi,

danke für deine umfangreiche Antwort ... aber das ist doch etwas zu HOCH für mich ...
Crying or Very sad
mal ne andere Frage - anderer Befehl, wenn man das mit importdata einlesen würde: Rolling Eyes

siehe bitte kurz im Anhang mein SCreenshot ...

Ich erhalte ein erstmal "optisch" brauchbares Cell Array ...aber das kann ich leider nicht "handle"-n ...

Wenn du das so siehst , von der Dimension und den Datensatz
kennst du ja bereits ... kann man da spaltenweise in das Cell Array zugreifen ???
Wink
Danke für Tips & Tricks vorab...
beste Grüße
stoxxii
 
uzcyi
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 66
Anmeldedatum: 22.12.15
Wohnort: Nähe Pforzheim
Version: ---
     Beitrag Verfasst am: 11.06.2018, 23:59     Titel:
  Antworten mit Zitat      
Hallo stoxxii,

leider hast du kein Anhang hochgeladen.

In Matlab ist fast alles möglich Very Happy


Viele Grüße
uzcyi
Private Nachricht senden Benutzer-Profile anzeigen
 
stoxxii

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2018, 14:12     Titel: >> jetzt mit txt.-Datei im Anhang
  Antworten mit Zitat      
Halloo Uzcyi,

ich habe jetzt meine Datei noch mal angehängt ... sicher keine elegante Variante
Daten einzulesen, um mit "importdata" ein cellarray zubekommen,
Also ich will mit sscanf hinbekommen, alles in ein double-array umzuwandeln ... Crying or Very sad

Code:
data = importdata('RudernUwe.txt','r');
Testbereich = cell2mat([data(33:44,1)])
% ::::::::::::::::::
for k = 1:11
    Mtx(k,:) = sscanf(Testbereich(k,:), '%d %f %f %d %d %f %d %*s', [1, inf] );
end;
Mtx

klar , die letzte Spalte mit den Strings muss ich überspringen mit dem *Sternchen ...
aber das Haupt-Problem besteht im Format meines Datums, welches 2 Pkt.-Trennung hat - dd.mm.yy -
und das bekomm ich nicht mit sscanf convertiert ... Rolling Eyes

Vielleicht könnt ihr mir weiterhelfen ??? Wink
Danke vorab...
beste grüße
stoxxii

RudernUwe.txt
 Beschreibung:

Download
 Dateiname:  RudernUwe.txt
 Dateigröße:  3.38 KB
 Heruntergeladen:  199 mal
 
uzcyi
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 66
Anmeldedatum: 22.12.15
Wohnort: Nähe Pforzheim
Version: ---
     Beitrag Verfasst am: 12.06.2018, 18:07     Titel:
  Antworten mit Zitat      
Hallo stoxxii,

mit sscanf kannst du kein Delimiter vorgeben bzw. ich bin auf dem Schlauf würde wahrscheinlich funktionieren denke ich mal.

Code:
fileID = fopen('RudernUwe.txt','r');
Testbereich = textscan(fileID,'%s%s%s%s%s%s%s%s%*s%[^\n\r]','Delimiter','\t','TextType','string');
fclose(fileID);
Mtx = [Testbereich{1:end-1}]
Mtx =

  94×8 string array

    "No"    "Date"        "Distance"    "Time"     "SproM"    "Watt"    "Kalorien"    "VSPLuer"
    "1"     "10.09.16"    "3000"        "12.37"    "25"       "176"     "190"         "V"      
    "2"     "12.09.16"    "3000"        "12.33"    "25"       "179"     "192"         "V"  
 


Viele Grüße
uzcyi
Private Nachricht senden Benutzer-Profile anzeigen
 
stoxxii

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2018, 13:31     Titel: >> Code textscan habe ich leider nicht
  Antworten mit Zitat      
Halloo Uscyi,

danke für deine erneute Hilfe ...
Leider habe ich Befehl " textscan nicht weil ich noch mit Uralt Version 6.5 R13 arbeite ...

Übrigens bin ich selber auch weiter gekommen und habe andere Programimierung gefunden : bzw. selber geschrieben: Rolling Eyes

Code:
data = importdata('RudernUwe.txt','r');
Row3344 = cell2mat([data(34:45,1)])                 % nur ein Test-Bereich
% ::::::::::::::::::
for k = 1:11
    Mat(k,:) = sscanf(Row3344(k,:), '%d %d.%d.%d %f %d.%d  %d %d %d %s', [1, inf] );
end;
Mtx

mit Mtx habe ich zumindest ein double array ... aber besser weiter verarbeiten und berechnen oder plotten kann ich die einzelnen Spalten dann doch noch nicht ... Crying or Very sad
Woran es hier noch fehlt: den separate Zugriff auf die einzelnen Spalten ...
>> insbes. sieht die Spalte " Datum" nicht gut aus ...
Vielleicht hast du / ihr noch nen Tip ,. Idee ... Wink
Danke vorab ...
grüße
stoxxii
 
uzcyi
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 66
Anmeldedatum: 22.12.15
Wohnort: Nähe Pforzheim
Version: ---
     Beitrag Verfasst am: 13.06.2018, 16:51     Titel:
  Antworten mit Zitat      
Hallo stoxxii,

die Version 6.5 R13 kenne ich nicht sagt mir momentan nichts.
Aber ich würde behaupten das du jetzt schon auf die einzelen Spalten eigentlich Zugriff hast?
mit den folgenden Befehl:

Code:
Mat(:,1)  % Zugriff 1.Spalte


Hier der plot für die erste Spalte
Code:
[row,col] = size(Mat);
tx = 1:1:row; %
figure;
plot(tx, Mat(:,1))


Viele Grüße
uzcyi
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 - 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.