einlesen von daten < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Aufgabe | Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Nach dem einem Lokalsender, off air, die Staumeldungen gefallen hatten,
sollen Sie nun die Funktionalität jener Funktion erweitern. Die Ausgangsdaten, so wie
die stündlichen Änderungen kommen per email und werden im ASCII-format gespeichert,
siehe Kurswebseite: Ausgangsdaten.txt und Mitteilung1.txt bis Mitteilung3.txt.
Schreiben Sie eine Funktion Neue Mitteilungen(name), die die Daten aus der Datei name
einliest und als Struktur zurück gibt. So dann schreiben Sie eine Funktion Stauaende-
rung(Meldungen,Aenderungen), die veraltete Meldungen herausnimmt, Alte aktualisiert
und Neue einf¨ugt. Dabei sei eine Meldung veraltet, wenn seit 3 Stunden oder mehr keine Änderung, bzw. Bestätigung der Meldung eingetroffen ist. Ferner ist eine Meldung veraltet, wenn die Autobahn wieder frei ist. Das Resultat von Stauänderungen sei wiederum eine Struktur mit den notwendigen Daten. |
Hi,
ich muss diese Aufgabe bis Freitag gelöst habe und ich sitze seit 1 Woche dran und komme einfach nicht weiter. Die Mitteilungen sind uns als txt gegeben. Ich weiß einfach nicht, wie ich diese Daten jetzt abspeichern soll, damit ich diese dann abrufen kann.
Ich hab es versucht die Mitteilungen gemeinsam in einer m-Datei zu speichern und die dann mit folgendem Befehl abzurufen, aber das funktioniert irgendwie nicht.
%function-file: Daten
function[] = Neue_Mitteilungen(name)
fid = fopen(name,'r');
scan = fscanf(fid,'%c')
fclose(fid);
Kann mir irgenwer bitte helfen. :(
|
|
|
|
Hallo,
> Die Mitteilungen sind uns als txt gegeben.
Hättest du die hier angehängt, könnten wir uns eher ein Bild vom Format machen.
> Ich weiß einfach nicht, wie ich diese Daten jetzt abspeichern soll, damit ich diese dann abrufen kann.
Die sind doch schon in einer Datei. Wozu also nochmal speichern? Oder meinst du nach einer Änderung?
Warum nicht einfach im Klartext?
Mehr Informationen bitte.
Gruß
Martin
|
|
|
|
|
Die Mitteilungen sehen ungefähr so aus:
%% Datenmaterial für die Abschlussaufgabe 2007
12Uhr5 A5 Kassel - Friedberg : 4km
12Uhr16 A5 Friedberg - Kassel : 8km
12Uhr27 A5 Frankfurt-Friedberg : 12km
12Uhr39 A45 Hanau-Giessen : 2km
12Uhr41 A5 Darmstadt - Frankfurt : 2km
12 Uhr 47 A3 Wiesbaden - Frankfurt :3km
12 Uhr 51 A3 Aschaffenburg - Frankfurt : 2km
Was ich bisher hab ist folgendes:
%function-file: Einlesen
function[] = Neue_Mitteilungen(name)
fid = fopen(name,'r');
scan = fscanf(fid,'%c')
fclose(fid);
while length(scan>1)
[token, scan] = strtok(scan, char(10));
[Zeit Autobahn von nach Strecke]=strread(token, ' %s %s %s %s %s','delimiter', ' -:');
struct('Zeit',[Zeit],'Autobahn',[Autobahn],'von',[von],'nach',[nach],'Strecke',[Strecke])
end
Jetzt weiß ich nur nicht wie die Einträge gelöscht und aktualisiert werden können. Mit dem folgenden Ausdruck komm ich gar nicht weiter:
Neue_Mitteilungen=[name(1:i-1),name(i+1:end)]
|
|
|
|
|
Hallo,
ich denke, so kommst du nicht weiter.
Zu Neue_Meldungen:
Lies die Datei zeilenweise ein, das erspart Verwechslungen zwischen den Zeilen. Es geht mit fgetl.
Wie du siehst, ist das Format nicht ganz sauber. Mal sind Leerzeicheneingestreut, mal nicht. Das macht alles kaputt, wenn man einfach Tokens mit Trennzeichen erzeugt. Hier wären Regular Expressions angebracht. Die gibt es mit regexp.
Nach der Abarbeitung jeder Zeile musst du die erhaltenen Daten in deine Struktur schreiben. Dazu solltest du dir mal die Hilfe zu structs ansehen.
Es geht aber in etwas so:
meldungen(index).zeit = ...
meldungen(index).autobahn = ...
meldungen(index).von = ...
meldungen(index).nach = ...
meldungen(index).laenge = ...
Dann gibst du genau diese Struktur meldungen zurück.
Zu Stauänderungen:
Du gehst durch die Struktur (mit einem Index, s.o.) und schaust, ob es neuere Meldungen gibt, die in autobahn, von und nach übereinstimmen. Falls ja, ersetzt du deren zeit und laenge.
Wie sollen denn freie Autobahnen signalisiert werden? Mit '0km' oder mit 'frei'? Das müsste man ggf. bei Neue_Meldungen berücksichtigen.
Wenn man die alten Meldungen mit den Änderungen abgeglichen hat, hängt man die übrigen Änderungen dahinter.
Schließlich löscht man noch die, die älter als 3 Stunden sind, per:
if aktuelleZeit - neueMeldungen(i).zeit > 180, %in Minuten
neueMeldungen(i) = [];
end;
Lies dir mal die Hilfen durch und melde dich ggf. nochmal.
Gruß
Martin
|
|
|
|
|
Ganz ganz vielen Dank für deine Mühe und Hilfe. Hat mir sehr weitergeholfen.
Liebe Grüße
Cindy
|
|
|
|