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

Sortier-Programm

 

Huna
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 23.11.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2007, 11:36     Titel: Sortier-Programm
  Antworten mit Zitat      
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?


Gruß Anna
Private Nachricht senden Benutzer-Profile anzeigen


outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 23.11.2007, 12:54     Titel:
  Antworten mit Zitat      
Zitat:
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... Very Happy

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2007, 14:21     Titel:
  Antworten mit Zitat      
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?

Liebe Grüße
Anna
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 24.11.2007, 18:45     Titel:
  Antworten mit Zitat      
Zitat:
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... Smile


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2007, 14:39     Titel:
  Antworten mit Zitat      
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?

Gruß
Anna
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 27.11.2007, 17:12     Titel:
  Antworten mit Zitat      
Hallo Anna,

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
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2007, 17:23     Titel:
  Antworten mit Zitat      
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?

Liebe Grüße
Anna
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 27.11.2007, 17:51     Titel:
  Antworten mit Zitat      
Hallo Anna,

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:

Code:
fid = fopen('Veranstaltungen.txt','r');
g=textscan(fid,'%s %[^:] %*s %[^,] %*s %s %q' ,'commentStyle','%')
fclose(fid);


Aber Vorsicht: c und g sind nicht ganz gleich. Da muss noch etwas gebastelt werden.

Herzliche Grüße
Bijick (afk)
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2007, 16:18     Titel:
  Antworten mit Zitat      
Aber durch diese Befehlen wird mein Text gar nicht eingelesen?
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 28.11.2007, 16:25     Titel:
  Antworten mit Zitat      
Oh, ich seh grad, es muss heißen:

Code:
fid = fopen('Veranstaltung.txt','r');


Aber das hast Du bestimmt schon selbst gemerkt. Smile Bekommst Du eine Fehlermeldung oder passiert gar nichts? Woher soll ich wissen, warum es nicht funktioniert? Ein paar mehr Infos wären nicht schlecht. Cool

Liebe Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2007, 16:37     Titel:
  Antworten mit Zitat      
Wenn ich es eingeben, bekomme ich folgendes:
g =

{4x1 cell} {4x1 cell} {4x1 cell} {4x1 cell} {4x1 cell}


'Veranstaltungen.txt','r' ist doch richtige, weil ich die Datei mit dem Namen abgespeichert hab, oder?
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2007, 08:33     Titel:
  Antworten mit Zitat      
Was bisher danke deiner Hilfe zustande gekommen ist, sind folgende:
Code:
%function-file: mysort
fid = fopen('Veranstaltungen.txt','r') ;
text = fscanf(fid,'%c')
fclose(fid);

c(1,:) = [{'Dieter'} {'Sauwetter'} {'Samstag'} {datenum(2134, 12, 17)} {'Geschichte der Frankfurter MAthematik'}];
c(2,:) = [{'Harald'} {'Riesenhagel'} {'Freitag'} {datenum(2135, 1, 24)} {'Wo war Frankfurt'}];
c(3,:) = [{'Ferdinand'} {'Niederschlag'} {'Donnerstag'} {datenum(2134, 12, 18)} {'Vorsemesterkurse in Matlab'}];
c(4,:) = [{'Richard-Ludwig'} {'Dauerregen'} {'Montag'} {datenum(2135, 1, 2)} {'Programmieren mit Matlab'}];
[cneu,ind]=sort(c(:,1));
SortName=c(ind,:)
save SortName


[cneu,ind]=sort(cell2mat(c(:,4)))
SortDate=c(ind,:)
save SortDate

 


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.
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 29.11.2007, 11:12     Titel:
  Antworten mit Zitat      
Hallo Anna,

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:
Code:
g{4}=num2cell(datenum(g{4},'dd.mm.yyyy'));
c=[g{1} g{2} g{3} g{4} g{5}];


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 Very Happy
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2007, 13:22     Titel:
  Antworten mit Zitat      
Find ich super, dass du schon 100 Mal geholfen hast Laughing

Ich hab jetzt mal nur das eingegeben, was du geschrieben hast.
Code:

%function-file: mysort
fid = fopen('Veranstaltungen.txt','r');
g=textscan(fid,'%s %[^:] %*s %[^,] %*s %s %q' ,'commentStyle','%')
fclose(fid);

g{4}=num2cell(datenum(g{4},'dd.mm.yyyy'));
c=[g{1} g{2} g{3} g{4} g{5}];

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" ',s(k).Vorname,s(k).Nachname,...
s(k).Tag,Datum(k,:),s(k).Thema);
end
fclose(fid);

 


Allerdings bekomm ich als Fehlermeldung dann:

Code:

??? Undefined function or variable "csort".

Error in ==> e1 at 10
s = cell2struct(csort, fields, 2);
 



Liebe Grüße
Anna
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 29.11.2007, 13:42     Titel:
  Antworten mit Zitat      
Ah, das Sortieren muss natürlich dazwischen passieren (zwischen einlesen und rausschreiben). Aber das hatten wir ja schon vorher richtig.

Code:
[cneu,ind]=sort(c(:,1));    % Sortieren nach Vornamen
SortName=c(ind,:);


Die Variable heißt bei Dir dann SortName statt csort, das hatte ich übersehen. Sorry. Sortieren nach Nachnamen ginge mit

Code:
[cneu,ind]=sort(c(:,2));    % Sortieren nach Nachnamen
SortName=c(ind,:);


Klappt es jetzt?
Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.