|
|
Textdatei zerlegen und analysieren!!! |
|
FishermanJack |
Forum-Newbie
|
|
Beiträge: 4
|
|
|
|
Anmeldedatum: 12.11.17
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 12.11.2017, 00:51
Titel: Textdatei zerlegen und analysieren!!!
|
|
|
|
|
Hallo, ich bin neu hier und benutze seit einigen Tagen Matlab.
Leider komme ich nicht so recht mit dem und wollte mich hier beraten lassen.
Es geht um folgendes:
Ich habe ein . txt File das so Aussieht:
Element 1 A B
Datum I [kA] P [MW] Q [MVAr] Auslastung [%] Ploss [MW] Qloss [MVAr]
01-Jan-2016 00:00 0.072764 -11.221024 9.676507 16.537281 0.046547 -0.320333
01-Jan-2016 00:15 0.072764 -11.221024 9.676507 16.537281 0.046547 -0.320333
01-Jan-2016 00:30 0.075410 -11.476784 10.170571 17.138632 0.049610 -0.313734
Element 2 C D
Datum I [kA] P [MW] Q [MVAr] Auslastung [%] Ploss [MW] Qloss [MVAr]
01-Jan-2016 00:00 0.059806 -5.478059 10.849443 13.592312 0.033281 -0.341703
01-Jan-2016 00:15 0.056954 -4.063243 10.833959 12.944129 0.030693 -0.345954
01-Jan-2016 00:30 0.058824 -5.033469 10.832931 13.369067 0.032369 -0.342679
mit N Zeilen und M Elementen ( N für jedes Element gleich ).
Die Spalten sind fix.
Jetzt wurde ich gerne eine funktion schreiben welche mir alle Elemente Speichert, so dass ich beim Abrufen von jeweiligen Element die Daten bekomme so dass ich diese Analysieren kann(z.b Element 1 A B, plot I über Datum.
Habe vieles versucht mit textscan, fopen aber bin zu der lösung nicht gekommen.
Hoffe ihr könnt mir weiterhelfen.
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 12.11.2017, 09:52
Titel:
|
|
Hallo,
textscan
ist der richtige Ansatz. Bitte poste auch deinen Code und welche Probleme damit aufgetreten sind.
Grüße,
Harald
|
|
|
huhu0815 |
Forum-Century
|
|
Beiträge: 141
|
|
|
|
Anmeldedatum: 20.02.14
|
|
|
|
Wohnort: Dresden
|
|
|
|
Version: R2013b, R2014b, R2016b, R2018a
|
|
|
|
|
|
Verfasst am: 12.11.2017, 11:01
Titel:
|
|
Hallo
mit
textscan
und
regexp
geht das relativ komfortabel.
Alternativ kannst du mit
fopen
,
fclose
,
feof
, sowie
fgetl
Zeile für Zeile einlesen.
Mit
strfind
oder
strtok
kann man sich die Elemente herausholen.
Mit Ersterem ist man sehr schnell am Ziel, ist aber auch der schwierige Weg. Beim
Zweiten hat man viel mehr Tipparbeit, aber einfacher zu verstehen.
P.S.: Schau als erstes mal die Dokumentation zu den angegebenen Funktionen durch
_________________
Viele Grüße
|
|
|
FishermanJack |
Themenstarter
Forum-Newbie
|
|
Beiträge: 4
|
|
|
|
Anmeldedatum: 12.11.17
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 12.11.2017, 11:21
Titel:
|
|
|
|
|
Danke für die schnelle Antwort.
Hier mein Code bis jetzt:
%% Variablen
filename = 'test.txt';
delimiter = '\t';
startrow = 3;
rows = 7;
columns = 7;
%% Read columns of data as text:
formatSpec = '%s%f%f%f%f%f%f%[^\n\r]';
%% Open the text file.
fileID = fopen(filename,'r');
%% Read columns of data according to the format.
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter,'EmptyValue',NaN, 'HeaderLines',2);
%% Close the text file.
fclose(fileID);
%% Allocate imported array to column variable names
Datum = dataArray{:, 1};
I = dataArray{:, 2};
P = dataArray{:, 3};
Q = dataArray{:, 4};
Auslastung = dataArray{:, 5};
Ploss = dataArray{:, 6};
Qloss = dataArray{:, 7};
%% Plot
%% 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));
% Convert the contents of columns with dates to datetimes using the
% specified date format.
try
dates{1} = datetime(dataArray{1}, 'Format', 'dd-MMM-yyyy HH:mm', 'InputFormat', 'dd-MMM-yyyy HH:mm');
catch
try
% Handle dates surrounded by quotes
dataArray{1} = cellfun(@(x) x(2:end-1), dataArray{1}, 'UniformOutput', false);
dates{1} = datetime(dataArray{1}, 'Format', 'dd-MMM-yyyy HH:mm', 'InputFormat', 'dd-MMM-yyyy HH:mm');
catch
dates{1} = repmat(datetime([NaN NaN NaN]), size(dataArray{1}));
end
end
dates = dates(:,1);
%% Split data into numeric and string columns.
rawNumericColumns = {};
%% Replace non-numeric cells with NaN
R = cellfun(@(x) ~isnumeric(x) && ~islogical(x),rawNumericColumns); % Find non-numeric cells
rawNumericColumns(R) = {NaN}; % Replace non-numeric cells
%% Create output variable
test = table;
test.Element = dates{:, 1};
Hier habe ich mir Hilfe auch durch das Import Toll verschafen, aber ich bekomme das Problem das die Werte nur bis zum nächten Element gespeichert werden und ich weiss nicht wie ich diese dann zu einer Matrix verbinde.
Dann habe ich mir gedacht das ich eine Variable für Headerlines konstruiere wo die Namen der Elemente gespeichert werden sollten.
HeaderLines = cell(1, N);
while ~feof(fid)
k = k+1;
Line = fgetl(fid);
if ischar(Line)
break;
end
aber dies hat auch iergendwie nicht funtkioniert.
Ich entschuldige mich wen es Triviale Fehler gibt, da ich mich erst seit ein paar Tagen mit Matlab beschäftige.
DANKE
|
|
|
FishermanJack |
Themenstarter
Forum-Newbie
|
|
Beiträge: 4
|
|
|
|
Anmeldedatum: 12.11.17
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 12.11.2017, 11:43
Titel:
|
|
@huhu0815 danke für den Tipp,
habe schon einiges im Internet mit regexp gefunden jedoch ist mir das nicht so klar,
werde wahrscheinlich mehr Tippen müssen
|
|
|
FishermanJack |
Themenstarter
Forum-Newbie
|
|
Beiträge: 4
|
|
|
|
Anmeldedatum: 12.11.17
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 13.11.2017, 09:23
Titel:
|
|
|
|
|
ok, habe den Code jetzt
ffs = 'testNew.txt';
str = fileread( ffs );
xpr = '(?m)^Element\s+\d+\s+\w+\s+\w+\s*$';
[ block_list, headers ] = strsplit( str, xpr ...
, 'DelimiterType','RegularExpression' ...
, 'CollapseDelimiters',false );
block_list(1) = []; % Assumption: the first line is a delimiter
%%
Out = struct( 'BlockHead',headers, 'ColHead',{''}, 'Data',{[]} );
for jj = 1 : length( block_list )
Out(jj).BlockHead = strtrim( headers{jj} );
block = strtrim( block_list{jj} );
cac = textscan( block, '%s', 1, 'Delimiter','\n' );
Out(jj).ColHead = cac{:};
cac = textscan( block , '%s%s%f%f%f%f%f%f' ...
, 'HeaderLines' , 1 ... % strsplit captured one
, 'Delimiter' , {'\t',char(32)} ...
, 'CollectOutput' , true );
dt = strcat( char(cac{1}(:,1)), char(cac{1}(:,2)) );
sdn = datenum( dt, 'dd-mmm-yyyyHH:MM' ); % serial date number
Out(jj).Data = cat( 2, sdn, cac{2} );
end
nur das Problem ist,
>> Out(1)
ans =
scalar structure containing the fields:
BlockHead = Element 1 138_3C 138_3B
ColHead =
{
[1,1] = Date I [kA] P [MW] Q [MVAr] Auslastung [%] Ploss [MW] Qloss [MVAr]
}
Data = [](0x0)
das die Data nicht vorhanden ist.
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|