Hi,
ich muss folgende Aufgabe bis nächste Woche lösen:
Der Lokalsender off air möchte ein Sortier-Programm für seinen Veranstaltungskalender. Da die Veranstaltungen weder nach Terminen noch alphabetisch sortiert beim Sender eingehen, sollen sie eine kleine Funktion mysort schreiben. Diese Funktion soll die Daten, die in einer Datei abgelegt sind, einlesen, alphabetisch sortieren und in einer zweiten Datei ablegen und ferner eine chronologische Sortierung der Daten in einer dritten Datei speichern. Daher sollte der Aufruf in der Form mysort('Datei1','Datei2','Datei3') erfolgen.
Eine beispieldatei für die Veranstaltungshinweise ist die Datei Veranstaltung.txt.
% Sammlung von Veranstaltungen von und mit "off air"
Dietrich Sauwetter: Samstag, 17.12.2134 "Geschichte der Frankfurter Mathematik"
Harald Riesenhagel: Freitag, 24.1.2135 "Wo war Frankfurt"
Ferdinand Niederschlag: Donnerstag, 18.12.2134 "Vorsemesterkurse in Matlab"
Richard-Ludwig Dauerregen: Montag, 2.1.2135 "Programmieren mit Matlab"
Meine Frage:
1. Wie kann ich die gespeicherte Datei abrufen?
2. Gibt es einen Befehl für eine alphabetische Sortierung?
ich muss folgende Aufgabe bis nächste Woche lösen:
Ich würde sagen Du stehst unter Druck...also nix mit Ausgehen am Wochenende... tja...
1. Wie kann ich die gespeicherte Datei abrufen?
Es gibt viele Funktionen unter MATLAB, die ein Text-File auslesen können.
DLMREAD, TEXTSCAN, TEXTREAD, CSVREAD.
Man kann auch manuell öffnen und Daten einlese.
siehe dazu Hilfe zu FOPEN
2. Gibt es einen Befehl für eine alphabetische Sortierung?
SORT-Befehl
MfG
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.11.2007, 14:21
Titel:
Hi,
erst Mal danke für die Hilfe.
Ich hab jetzt die Datei öffnen können mit
fid = fopen('Veranstaltungen.txt',r),
aber wie kann ich die sortierte Datei dann in einer zweiten Datei ablegen?
aber wie kann ich die sortierte Datei dann in einer zweiten Datei ablegen?
schau ganz genau in der Doku rein zum Befehl FOPEN. Damit kann man die dateien nicht nur öffnen zum lesen (mit 'r'-Option), sondern auch öffnen zum schreiben (mit 'w'-Option). Mit FREAD kann man Daten lesen und mit FWRITE schreiben. Zur jedem Befehl findest Du in der Doku einen Beispiel...
Du sollst keine Angst haben von der MATLAB Dokumentation - die beisst nicht...
MfG
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.11.2007, 14:39
Titel:
Die Hilfen von Matlab schau ich mir an, aber Problem ist halt, dass ich nicht alles genau verstehe, weil es auf englisch ist.
Ich hab das alphabetische Sortieren folgender versucht:
fid = fopen('Veranstaltungen.txt','r') ;
text = fscanf(fid,'%c')
fclose(fid);
s = struct('name','Dieter Sauwetter','Datum','Samstag,17.12.2134','Thema','Geschichte der Frankfurter Mathematik')
struct('name','Alfred Müller','Datum','Samstag,17.12.2134','Thema','Geschichte der Frankfurter Mathematik')
[snew,perm] = orderfields(s,{name})
Wo liegt, denn der Fehler, dass ich die Namen nicht alphabetisch ordnen kann?
der Befehl orderfields sortiert die Felder der Struktur s alphabetisch. Die Felder sind "Name", "Datum" und "Thema". Du möchtest aber die Inhalte der Felder sortieren, also "Alfred Müller", "Dieter Sauwetter", ...
Versuch mal den Befehl sort, wie outsider schon vorgeschlagen hat. In der Tabelle in der Hilfe steht, dass man damit cells von string-Variablen alphabetisch sortieren kann. Anstelle einer struct müsstest Du dafür also ein cell array anlegen. Zum Beispiel so:
Code:
c(1,:) = [{'Dieter'}{'Sauwetter'}{'Samstag'}{datenum(2134, 12, 17)}{'Geschichte der Frankfurter Mathematik'}];
c(2,:) = [{'Alfred'}{'Müller'}{'Samstag'}{datenum(2134, 12, 17)}{'Geschichte der Frankfurter Mathematik'}];
[cneu,ind]=sort(c(:,2)); % Nach der zweiten Spalte "Nachname" sortieren
cNameSort=c(ind,:)
Mit datenum wandelt man ein Datum in eine Zahl um, dann kann man auch das leicht vergleichen.
Herzliche Grüße
Bijick
_________________
>> why
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.11.2007, 17:23
Titel:
Hallo Bijick,
gibt es eigentlich die Möglichkeit direkt die alphabetische Sortierung von der eingelesenen Datei zu machen? Oder muss man die Daten einzeln eingeben, um dann sortieren zu können?
für die Sortierung braucht man die Daten in cells. Aber mit dem textscan-Befehl kann man die formatierten Daten aus der Datei in ein cell array schreiben. Probier mal:
Aber das hast Du bestimmt schon selbst gemerkt. Bekommst Du eine Fehlermeldung oder passiert gar nichts? Woher soll ich wissen, warum es nicht funktioniert? Ein paar mehr Infos wären nicht schlecht.
Laut Aufgabenstellung braucht man einen Quellcode, der die beiden Ausgabe-Dateien erzeugt. Die Ausgabe-Dateien sind ja die sortierten eingehenden Daten. Aber wie sieht denn so ein Code aus? Ich weiß nicht wie ich den hinbekomme.
es fehlen jetzt noch zwei Bestandteile in Deinem Code: Das Einlesen der Datei (denn man soll ja mit verschiedenen eingehenden Dateien umgehen können) und das Schreiben in die zwei neuen Dateien.
1. Das Einlesen: Das funktioniert tatsächlich so, wie ich es geschrieben habe. In den cells von g sind alle Informationen enthalten. Gib zum Beispiel mal g{1} ein, dann bekommst Du alle Vornamen ausgegeben. Das Datum muss noch umgewandelt werden, damit man später sortieren kann. c wird dann folgendermaßen erzeugt:
2. Das Schreiben: Das ist etwas komplizierter. Jedenfalls weiß ich nicht, wie man aus cells wieder schreiben kann. Ich würde die Daten in ein struct umwandeln und dann zeilenweise schreiben:
Code:
fields = {'Vorname', 'Nachname', 'Tag', 'Datum', 'Thema'};
s = cell2struct(csort, fields, 2);
Datum = datestr([s(:).Datum],'dd.mm.yyyy');
fid = fopen('VeranstaltungenName.txt','w');
for k=1:length(ind) fprintf(fid,'%s %s: %s, %s "%s"\n',s(k).Vorname,s(k).Nachname,...
s(k).Tag,Datum(k,:),s(k).Thema);
end fclose(fid);
Das könnte gut noch eleganter gehen, aber ich denke, das ist hier nicht unbedingt notwendig. Schöne Aufgabe, um die verschiedenen Datentypen zu lernen!
Es fehlt natürlich noch das Sortieren nach Datum und zugehöriges Schreiben, aber das geht analog.
Herzliche Grüße
Bijick
PS: Mein 100. Beitrag
_________________
>> why
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 29.11.2007, 13:22
Titel:
Find ich super, dass du schon 100 Mal geholfen hast
Ich hab jetzt mal nur das eingegeben, was du geschrieben hast.
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.