Einlesen von Excel-Datei < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 17:21 Fr 20.10.2006 | Autor: | mjh53 |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt
hallo,
ich habe diverse Einführungstutorials durchgearbeitet...
habe also gewisse grundkenntnisse, die ich nun anwenden möchte....
nun das problem... ich habe eine excel-tabelle mit unterschiedlichen Spaltenformaten...(text & nummer)... ich möchte diese Tabelle nun in Mathlab einlesen... so dass die spaltennamen meine variablen darstellen, so dass man mit diesen weiterarbeiten kann...
macht es sinn, meine excel-tabelle vorher in eine text-datei zu ändern?
mathias
|
|
|
|
Hallo,
du musst deine Excel-Datei nicht ändern. Es gibt nämlich eine recht einfache Lösung.
Ich gehe davon aus, dass jede Spalte jeweils nur einen Datentyp (Zahl oder String) enthält und auch jede von ihnen eine andere Überschrift (späterer Variablenname) trägt. Sind diese Voraussetzungen erfüllt, dann geht es so:
[nums, txt] = xlsread('MeineExcelDatei.xls') %Einlesen der Datei
varNames = char(txt(1,:)); %Bestimmen der Spaltenüberschriften=Variablennamen
for col=1:size(varNames,1),
if isnan(nums(1,col)) %erstes Datenwort nicht numerisch?
assignin('base',varNames(col,:),char(txt(2:end,col))); %Zuweisen der Strings in der Spalte
else %falls doch numerisch?
assignin('base',varNames(col,:),nums(:,col)); %Zuweisen der Zahlen in der Spalte
end;
end;
So müste es funktionieren. Die Funktionen kannst du notfalls in der Hilfe nachschlagen oder hier fragen.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:51 Mo 23.10.2006 | Autor: | mjh53 |
hallo,
erstmal vielen Dank... ich habe deinen Vorschlag durchgearbeitet und auch einigermaßen nachvollziehen können... und es funktioniert auch... so alles super bis dahin... meine weitere Frage bezieht sich darauf, wenn ich meine Excel-Datei als Text-Datei abspeichere (Speichern als.... Text (Tab delimited)) und dann diese nach Matlab einbeziehen möchte... wie mache ich das?
vielen Dank
Mathias
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:14 Mo 23.10.2006 | Autor: | Martin243 |
Hallo,
das ist dann nicht mehr Excel-spezifisch und bringt (zumindest für meinen Lösungsansatz) folgende Fragen mit sich:
1. Ist die Spaltenanzahl bekannt?
2. Sind die Typen der einzelnen Spalten bekannt?
3. Wird als Dezimalzeichen ein Komma benutzt (im deutschen Excel Standard, Matlab benutzt den Punkt!)?
Wenn das Komma benutzt wird: Kann man davon ausgehen, dass es nur als Dezimalzeichen benutzt wird (und nicht in den Strings)?
Ich schaue mal, was sich machen lässt...
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:19 Mo 23.10.2006 | Autor: | Martin243 |
So,
die folgende Lösung baut darauf auf, dass die Anzahl der Spalten bekannt ist. Alle Kommas werden automatisch durch Punkte ersetzt und die Formate automatisch erkannt (falls sie in der ersten Datenzeile deutlich unterscheidbar sind).
Hier der Quelltext:
1: | function TXTassign(filename,cols)
| 2: | %TXTASSIGN Summary of this function goes here
| 3: | % Detailed explanation goes here
| 4: |
| 5: | %die Variablennamen
| 6: | varNames = char(textread(filename,'%s',cols));
| 7: |
| 8: | %die "nackten" Werte im cell-array
| 9: | cellStrValues = textread(filename,'%s',-1,'headerlines',1);
| 10: |
| 11: | %alle Kommas durch Punkt ersetzen
| 12: | strValues = char(strrep(cellStrValues,',','.'));
| 13: |
| 14: |
| 15: | for col=1:cols,
| 16: |
| 17: | %testweise ersten Wert in Zahl umwandeln, bei Erfolg: gesamte Spalte
| 18: | if size(str2num(strValues(col))) == [1 1]
| 19: | for row=1:size(cellStrValues,1)/5,
| 20: | a(row,:) = str2double(strValues(col+(row-1)*cols,:));
| 21: | end;
| 22: | assignin('base', varNames(col,:), a);
| 23: |
| 24: | else %falls erster Wert keine Zahl
| 25: | for row=1:size(cellStrValues,1)/5,
| 26: | b(row,:) = strValues(col+(row-1)*cols,:);
| 27: | end;
| 28: | assignin('base', varNames(col,:), b);
| 29: |
| 30: | end;
| 31: |
| 32: | end;
|
Ich hänge die Datei besser mal an.
Datei-Anhang
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:21 Di 24.10.2006 | Autor: | mjh53 |
hallo...
das durcharbeiten deiner lösungen bringt mich mit matlab erheblich weiter...
so wohl auch mit diesem vorschlag, den ich im moment durcharbeite...
daher vielen dank...
ich schick dir mal eine datei, die ich so gerne in matlab einlesen möchte, und danach auch bearbeiten können sollte...
ich weiss, dies ist wohl schon high-level, aber, sollte dir das möglich sein, ist es für mich wohl das effektivste, dann diese, deine lösung nachzuvollziehen...
schaun wir mal...
viele grüße
mathias
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: txt) [nicht öffentlich]
|
|
|
|
|
Puuh,
ich musste feststellen, dass mein Code an einigen Stellen etwas buggy war und an anderen etwas ungenau.
Ich habe mal alles überarbeitet, aber eine Sachen gibt es, die nicht implementiert ist:
An einigen Stellen (mehrmals in der Kopfzeile und 2-3mal in der zweiten(?) Spalte) befinden sich zu viele Tabulatoren. Die musste ich zuerst manuell zurechtrücken. Darauf sollte man am besten direkt bei der Erhebung der Daten achten.
Neu:
- Es werden nun auf Wunsch Zeitangaben (Spalten 3 und 4) in Sekunden umgerechnet.
- Über einen Parameter kann man die Formatierung einer Spalte als String erzwingen.
- "Sonderzeichen" - in deinem Fall Klammern und der Schrägstrich - werden in Variablennamen automatisch durch einen Unterstrich ersetzt.
- weniger Fehler (?)
Der Quelltext:
1: | function TXTassign(filename,cols,forceStringCols,enableTimeConversion)
| 2: | %TXTASSIGN Spaltenweise Zuweisung von Datensätzen aus Tab-getrennten Tabellen
| 3: | % TXTASSIGN(filename, cols, forceStringCols)
| 4: | % filename = Dateiname
| 5: | % cols = Anzahl der Spalten
| 6: | % forceStringCols = Spaltennummern mit erzwungener Formatierung als String
| 7: | % enableTimeConversion = Zeitangabenumwandlung ein, falls ungleich 0
| 8: |
| 9: | %die Variablennamen
| 10: | varNames = textread(filename,'%s',cols,'delimiter','\t');
| 11: |
| 12: |
| 13: | %Ersetzung von "Sonderzeichen"
| 14: | varNames = strrep(varNames,'/','_');
| 15: | varNames = strrep(varNames,'(','_');
| 16: | varNames = strrep(varNames,')','_')
| 17: |
| 18: |
| 19: | %die "nackten" Werte im cell-array
| 20: | cellStrValues = textread(filename,'%s',-1,'headerlines',1,'delimiter','\b\t');
| 21: |
| 22: | %alle Kommas durch Punkt ersetzen
| 23: | strValues = char(strrep(cellStrValues,',','.'));
| 24: |
| 25: |
| 26: |
| 27: |
| 28: | for col=1:cols
| 29: |
| 30: | %Wert auf Eignung als Zahl testen, bei Erfolg: gesamte Spalte umwandeln
| 31: | if (size(regexpi(strValues(col,:),'[^\+\-\.0123456789ed ]')) == [0 0]) & ~any(forceStringCols==col)
| 32: | for row=1:size(cellStrValues,1)/cols,
| 33: | a(row) = str2double(strValues(col+(row-1)*cols,:));
| 34: | end;
| 35: | assignin('base', char(deblank(varNames(col))), a);
| 36: |
| 37: |
| 38: | %Umwandlung von Zeitangaben der Form hh:mm:ss in Sekunden
| 39: | elseif (size(regexpi(strValues(col,:),'\d{2}:\d{2}:\d{2}')) ~= [0 0]) & enableTimeConversion & ~any(forceStringCols==col)
| 40: | for row=1:size(cellStrValues,1)/cols,
| 41: | c(row) = eval(strcat('((',strrep(strValues(col+(row-1)*cols,:),':',')*60+')));
| 42: | end;
| 43: | assignin('base', char(deblank(varNames(col))), c);
| 44: |
| 45: |
| 46: |
| 47: |
| 48: | else %falls erster Wert keine Zahl und keine Zeitangabe
| 49: | for row=1:size(cellStrValues,1)/cols,
| 50: | b(row,:) = strValues(col+(row-1)*cols,:);
| 51: | end;
| 52: | assignin('base', char(deblank(varNames(col))), b);
| 53: |
| 54: | end;
| 55: |
| 56: | end; |
Bei mir funktionierte es bestens mit dem Aufruf:
TXTassign('Daten1.txt', 45, [2], 1);
was bedeutet:
Datei 'Daten1.txt' verarbeiten, dabei von 45 Spalten ausgehen, Spalte 2 unbedingt als String behandeln (da die erste Zeile eine 0 enthält, wäre sie automatisch numerisch!) und die automatische Zeitangabenumrechnung einschalten.
Hier die korrigierte Datendatei und die neue TXTassign-Funktion:
Daten1.txt
TXTassign.m
Ich hoffe, jetzt läuft es...
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: txt) [nicht öffentlich] Anhang Nr. 2 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:18 Fr 27.10.2006 | Autor: | mjh53 |
hallo,
das sieht sehr gut aus, übersteigt aber natürlich erstmal mein greenhorn matlab verständnis... ich bin am durcharbeiten... trotzdem schonmal eine frage dazu...
beim aufrufen der funktion erhalte ich folgenden fehler in zeile 41...
??? Error: Expected a variable, function, or constant, found "end of line".
Error in ==> [mm] C:\MATLAB6p5\work\TXTassign.m
[/mm]
On line 41 ==> c(row) = eval(strcat('((',strrep(strValues(col+(row-1)*cols,:),':',')*60+')));
was bedeutet das... ist am Programmcode ein kleiner fehler...??
vielen, vielen
Dank
|
|
|
|
|
Hallo,
nein es ist kein echter Fehler im Quelltext. Aber:
Ich konnte dein Problem nachvollziehen, indem ich beim Aufruf der Funktion eine falsche Spaltenanzahl angab. Dadurch wird (dynamisch) falscher Code erzeugt, weil versucht wird, aus Daten ohne ":" eine Zeitangabe zu extrahieren.
Nochmal: Die von mir an meinen letzten Beitrag angehängte Datei wurde problemlos mit 45 Spalten verarbeitet. Benutzt du evtl. andere Spaltenanzahlen?
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:44 Mi 01.11.2006 | Autor: | mjh53 |
hallo...
erstmal vielen Dank, das ist allerdings wohl noch ne nummer zu hoch für mich... ich halte mich daher an einfacheres....was nicht heißt, dass es dort keine Probleme gibt.....
wie lade ich solch eine datei nach matlab?
vg
mathias
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: txt) [nicht öffentlich]
|
|
|
|
|
Hallo,
da habe ich mal nicht das Rad neu erfunden, sondern die alte Funktion etwas angepasst.
Es fällt nämlich auf, dass deine Daten keine Kopfzeile besitzen. Es muss also eine Möglichkeit geben, die Variablennamen an die Funktion zu übergeben. Gibt es jetzt auch.
Außerdem sind diese Daten jetzt kommasepariert, die letzten waren mit Tabulatoren getrennt. Das soll es jetzt auch als Parameter geben.
Na ja, so sieht es jetzt aus:
1: | function TXTassign(filename,cols,delimiter,decimalPoint,forceStringCols,enableTimeConversion)
| 2: | %TXTASSIGN Spaltenweise Zuweisung von Datensätzen aus Tab-getrennten Tabellen
| 3: | % TXTASSIGN(filename,cols,delimiter,decimalPoint,forceStringCols,enableTimeConversion)
| 4: | % Nur die beiden ersten Argumente sind obligatorisch, die anderen können
| 5: | % (in angegebener Reihenfolge) folgen, werden aber andernfalls auf Standardwerte gesetzt.
| 6: | % filename = Dateiname
| 7: | % cols = Anzahl der Spalten ODER Variablennamen im Format: {'Überschrift1', 'Überschrift2',...,'ÜberschriftN'}
| 8: | % delimiter = Spaltentrennzeichen; Standard: ','
| 9: | % decimalPoint = Zeichen für den Dezimalpunkt; Standard: '.'
| 10: | % forceStringCols = Spaltennummern mit erzwungener Formatierung als String; Standard: []
| 11: | % enableTimeConversion = Zeitangabenumwandlung ein, falls ungleich 0; Standard: 0
| 12: |
| 13: | %fehlende Argumente durch Defaultwerte ergänzen
| 14: | if nargin<3 delimiter = ','; end
| 15: | if nargin<4 decimalPoint = '.'; end
| 16: | if nargin<5 forceStringCols = []; end
| 17: | if nargin<6 enableTimeConversion=0; end
| 18: |
| 19: | %die Variablennamen
| 20: | if isnumeric(cols)
| 21: | hasHeader = 1;
| 22: | varNames = textread(filename,'%s',cols,'delimiter',delimiter);
| 23: | elseif iscell(cols)
| 24: | hasHeader = 0;
| 25: | varNames = cols;
| 26: | cols = size(varNames,2);
| 27: | else
| 28: | error('Argument cols hat ein unbekanntes Format!')
| 29: | end
| 30: |
| 31: | %Ersetzung von "Sonderzeichen"
| 32: | varNames = strrep(varNames,' ','_');
| 33: | varNames = strrep(varNames,'/','_');
| 34: | varNames = strrep(varNames,'(','_');
| 35: | varNames = strrep(varNames,')','_');
| 36: |
| 37: | %die "nackten" Werte im cell-array
| 38: | if hasHeader
| 39: | cellStrValues = textread(filename,'%s',-1,'headerlines',1,'delimiter',delimiter);
| 40: | else
| 41: | cellStrValues = textread(filename,'%s',-1,'delimiter',delimiter);
| 42: | end
| 43: |
| 44: | %Dezimalpunktzeichen durch Punkt ersetzen
| 45: | strValues = char(strrep(cellStrValues,decimalPoint,'.'));
| 46: |
| 47: | for col=1:cols
| 48: | %Wert auf Eignung als Zahl testen, bei Erfolg: gesamte Spalte umwandeln
| 49: | if (size(regexpi(strValues(col,:),'[^\+\-\.0123456789ed ]')) == [0 0]) & ~any(forceStringCols==col)
| 50: | for row=1:size(cellStrValues,1)/cols,
| 51: | tmp(row) = str2double(strValues(col+(row-1)*cols,:));
| 52: | end;
| 53: | %Umwandlung von Zeitangaben der Form hh:mm:ss in Sekunden
| 54: | elseif (size(regexpi(strValues(col,:),'\d{2}:\d{2}:\d{2}')) ~= [0 0]) & enableTimeConversion & ~any(forceStringCols==col)
| 55: | for row=1:size(cellStrValues,1)/cols,
| 56: | tmp(row) = eval(strcat('((',strrep(strValues(col+(row-1)*cols,:),':',')*60+')));
| 57: | end;
| 58: | else %falls erster Wert keine Zahl und keine Zeitangabe
| 59: | for row=1:size(cellStrValues,1)/cols,
| 60: | tmp(row,:) = strValues(col+(row-1)*cols,:);
| 61: | end;
| 62: | end;
| 63: | assignin('base', char(varNames(col)), tmp);
| 64: | clear tmp;
| 65: | end; |
Da die letzten vier Argumente nun optional sind, sieht der Aufruf für die aktuelle Datei so aus:
TXTassign('Daten2.txt', {'A','B','C','D','E','F','G','H'})
Beachte die geschweiften Klammern, die die Variablennamen umschließen!
Die alte Datei kriegen wir auch noch importiert mit folgendem Aufruf:
TXTassign('Daten1.txt', 45, '\t', ',', [], 0)
Was die Parameter bedeuten, steht im Quelltext.
Ich hänge die m-Datei mal an: TXTassign.m
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:53 Mi 01.11.2006 | Autor: | mjh53 |
hallo,
funktioniert, super... eine weitere Fragen:
1. gibt es für dieses format eine einfache einlesemöglichkeit... wie gesagt, ich habe ja den anspruch, auch zu verstehen, was da passiert, und das programm ist ja wie gesagt wunderbar... aber wohl für mein level etwas zu hoch... so step by step... ich denke, da dies super einfaches und strukturiertes datenmaterial ist ohne komplizierten ausnahmen, wäre es sehr lerneffektiv zu sehen, wie eine einfache dateneinlese aussieht...
|
|
|
|
|
Hallo,
ok, ich sehe ein, dass ich etwas übers Ziel hinausgeschossen bin... Da ich aber auch eher Matlab-Anfänger bin, habe ich das als gute Übung angesehen...
Dann mal schrittweise. Ich will zuerst mal beschreiben, welche Probleme zu lösen sind:
1. Die Anzahl der Spalten ist kaum feststellbar, da die Daten alle am Schnürchen gelesen werden. Also müssen wir diesen Parameter explizit angeben.
2. Die neuen Daten enthalten keine Kopfzeile. Wir müssen also
a) die Variablennamen selbst übergeben, wobei sich durch diese Angabe Problem 1 selbst löst oder
b) uns Variablennamen selbst nach einer Regel wie "aa, ab, ac, ad, ae usw." erzeugen lassen.
Ich denke, Variante a ist schöner, wenn die Namen Aussagekraft haben sollen.
3. Die Datentypen sind gemischt. Also müssen wir entweder
a) analog zu den Variablennamen auch die Typen der einzelnen Spalten übergeben oder
b) die Datentypen automatisch erkennen.
Variante b ist eleganter und nicht allzu schwierig. Sie versagt allerdings, wenn vermeintliche Strings nur aus Ziffern bestehen.
Dann wollen wir mal Schritt für Schritt das Programm entwickeln:
(1) Wir überlegen uns Variablennamen und legen sie in einem CellArray (deswegen die geschweiften Klammern) ab. Wir können kein einfaches Char-Array benutzen, weil dieses verlangt, dass alle Variablennamen gleichlang sind, was uns doch sehr einschränkt!
varNames = {'a','langerName','kurz','t_0','blabla','f','g','h'}
(2) Wir haben keine Kopfzeile, also lesen wir einfach die komplette Datei aus. Die Daten sollen zunächst alle als Strings aufgefasst werden ('%s') und die Datei soll bis zum Ende ausgelesen werden (-1). Das Trennzeichen ('delimiter') soll dabei das Komma (',') sein. Das Ergebnis landet automatisch in einem CellArray, ist am flexibelsten. Die Daten liegen alle hintereinander.
cellStrValues = textread('Daten2.txt','%s',-1,'delimiter',',');
(3) Wir wandeln das CellArray nun in ein CharArray, also Strings, um.
strValues = char(cellStrValues);
(4) Nun müssen wir Spalte für Spalte vorgehen. Die Spaltenzahl erhalten wir, indem wir die Anzahl unserer Variablennamen bestimmen. Diese entspricht der Breite des in (1) angelegten CellArrays:
cols = size(varNames,2);
(5) Nun gehen wir Spalte für Spalte vor:
for col=1:cols
(6) Wir wollen feststellen, ob die erste Zeile der aktuellen Spalte wie eine Zahl aussieht. Dazu schauen wir, ob darin noch andere Zeichen vorkommen als +-.0123456789ed . Das ist zwar ein schwaches Kriterium, aber meistens sollte es reichen. Der Test wird mit einem regulären Ausdruck durchgeführt. Ich erkläre ihn an dieser Stelle nicht, weil ich mir etwas Besseres einfallen lassen möchte. Vielleicht kennst du das aber schon aus irgendwelchen Programmiersprachen oder Betriebssystemen.
if (size(regexpi(strValues(col,:),'[^\+\-\.0123456789ed ]')) == [0 0])
(6a) Wenn wir annehmen können, dass wir eine Zahlenspalte vorliegen haben, können wir die Zahlen extrahieren. Dazu bestimmen wir die Anzahl der Zeilen, indem wir die Gesamtanzahl der Daten durch die Spaltenanzahl teilen Klar, oder? Die Extraktion geschieht Zeile für Zeile:
for row=1:size(cellStrValues,1)/cols,
(6b) Wir weisen einer temporären Variablen die Zahl zu, die sich aus dem String ergibt. Die Berechnung der Indizes ist nicht sehr kompliziert: Da die Daten linear in strValues abgelegt sind, wir aber eine Matrix "simulieren" wollen, müssen wir auf jeden cols-ten werden zugreifen. Der Doppelpunkt am Ende bedeutet, dass wir alle Indizes durchlaufen, die es dort gibt. Das liegt daran, dass ein String auch ein Array ist und wir alle Chars mitnehmen wollen.
tmp(row) = str2double(strValues(col+(row-1)*cols,:));
(6c) Und weiter geht's mit der nächsten Zeile:
end;
(7) Falls wir in der aktuellen Spalte keine Zahlen vermuten,
else
(7a) gehen wir auch zeilenweise vor,
for row=1:size(cellStrValues,1)/cols,
(7b) fassen aber alle Werte als Strings auf. Deswegen weisen wir unserer temporären Variablen diesmal direkt die Strings zu. Das "tmp(row,:)" kommt daher, dass die Strings aus einzelnen Chars bestehen und wir natürlich alle tmp zuweisen müssen. Ähnlich wie in (6b), aber dort wurden daraus Zahlen, die "atomar" sind.
tmp(row,:) = strValues(col+(row-1)*cols,:);
(7c) Und weiter geht's mit der nächsten Zeile:
end;
(8) Wir schließen unsere Fallunterscheidung ab:
end;
(9) Nun weisen wir die Werte der aktuellen Spalte einer Wunschvariablen zu. Das "deblank" entfernt überflüssige Leerzeichen am Ende des Namens, die automatisch hinzugefügt werden, damit die Strings gleichlang sind.
assignin('base', char(deblank(varNames(col))), tmp);
(10) Nun löschen wir wieder die temporäre Variable, damit sie im nächsten Durchlauf nicht denselben Typ hat.
clear tmp;
(11) Und ab in die nächste Spalte:
end;
So, ich hoffe, es haben sich jetzt keine Fehler eingeschlichen.
Falls du Fragen zu den einzelnen Schritten hast, nur zu!
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:32 Mi 01.11.2006 | Autor: | mjh53 |
hallo...
vielen dank.. lernunterstützung pur... wie du sicher schon gemerkt hast, bin ich programmier-anfänger.. daher ist für mich super viel neu... mit deiner kleinen dokumentation und der help-funktion von matlab komme ich einigermaßen voran... trotzdem gibt es noch lücken... und wie mir scheint ist aus der high-level version keine simple-anfänger-version geworden, sondern eher noch einen tick schärfer, aber ok, ich muss da durch... und erstmal eine nacht drüber schlafen.... trotzdem noch eine frage zu der aktuellen tabelle.... die vierte spalte ist ja datum und uhrzeit.. 20050511142455 ... als numeric... wie kann ich denn da einen string draus machen... mit [4] beim einlesen hat es nicht funktioniert... ich würde gerne ein schaubild generieren, wobei die x-achse meine zeit darstellen soll....mmm
mathias
|
|
|
|
|
Hallo,
> und wie mir scheint ist aus der high-level version keine simple-anfänger-
> version geworden, sondern eher noch einen tick schärfer, aber ok, ich
> muss da durch...
Na ja, wie gesagt: Es gibt die aufgezählten Probleme, also müssen wir (bzw. die Funktion) flexibel sein.
> wie kann ich denn da einen string draus machen... mit [4] beim einlesen
> hat es nicht funktioniert...
Da müssen wir die automatische Zahlenerkennung (die aber für die anderen Spalten ok ist, wie mir scheint) für einzelne Spalten ausschalten.
Das erfordert zwei Modifikationen an den richtigen Stellen, die aus der Nummerierung hervorgehen:
(1a) Wir geben einfach die Spaltenzahlen an, die explizit Strings enthalten sollen, die eigentlich als Zahlen erkannt würden:
forceString = [4];
(6) Wir ergänzen unser Zahlenerkennungskriterium um die Bedingung, dass die aktuelle Spalte nicht als String markiert sein darf. Die Funktion "any" sagt uns, ob die aktuelle Spalte in der Liste forceString vorkommt. Nur falls dies nicht der Fall ist (Negation "~"), dürfen wir umwandeln:
if (size(regexpi(strValues(col,:),'[^\+\-\.0123456789ed ]')) == [0 0]) & ~any(forceString==col)
Damit wäre dieses Probem wohl behoben.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:15 Do 02.11.2006 | Autor: | mjh53 |
hallo,
nun funktioniert alles wunderbar... Die Spalte Date ist nun ein string und eine zeile sieht so aus ...'20060511142425'... wie kann ich denn daraus ein datumsformat machen, und wie kann ich dann daraus meine zeitachse generieren.... fragen über fragen...
Gruß
mathias
|
|
|
|
|
Aufgabe | wie kann ich denn daraus ein datumsformat machen |
Hallo,
was genau möchtest du denn machen?
Möchtest du aus '20060511142425' einen anderen String wie '2006-05-11 14:24:25' oder '11.05.2006 14:24:25' erzeugen? Sieht schön aus aber damit kann man die x-Achse nicht beschriften.
Oder willst du eher den Zeitpunkt '20060511142425' in Sekunden umrechnen? Damit kann man dann die x-Achse beschriften, sieht aber hässlich aus.
Hmm, was meinst du also mit "Datumsformat"?
Gruß
Martin
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:39 Fr 03.11.2006 | Autor: | mjh53 |
hallo...
ich habe nun mit datenum einen vektor erstellt... so wie ich das sehe, ist das die umrechnung in sekunden... die werte dieses vektors kann ich nun für die x-achse verwenden... doch zwei problemchen...wie kann ich das schaubild so darstellen, dass es übersichtlich ist, und trotzdem ein ganzer Tag dargestellt wird, und wie kann ich die zeitangaben bzw. zahlenangaben der x-achse verändern, so dass z.B nur alle 20 minuten die zeit angezeigt wird...
mfg
mathias
|
|
|
|
|
Hallo,
da du anscheinend die Umwandlung hinbekommen hast, kann ich dir an einem Beispiel zeigen, wie die Beschriftung funktioniert (habe ich gerade erst herausbekommen...).
Übrigens wird das Datum durch datenum in Tage umgewandelt, nicht in Sekunden.
Das Beispiel:
Wir betrachten einen Aktienverlauf zu hundert Zeitpunkten innerhalb von zwei Stunden (heute 14:00 bis 16:00). Wir haben also 100 Datenpunkte, wollen aber nur alle 20 min eine Zeitangabe setzen.
Datenerzeugung:
kurs = cumsum(10*(rand(1,100)-0.5));
startzeit = datenum(2006,11,3,14,0,0);
endzeit = datenum(2006,11,3,16,0,0);
Berechnung der Markierungszeitpunkte (alle 20 Minuten, also 1/72 Tag):
markT = startzeit:1/72:endzeit;
Berechnung der Markierungen (verschiedene Formate sind in der Hilfe zu datestr zu finden):
mark = datestr(markT,15);
Und schon plotten wir:
plot(startzeit:(endzeit-startzeit)/(size(kurs,2)-1):endzeit,kurs);
... und passen schließlich die Markierungen an:
set(gca,'XTickLabel',mark,'XTick',markT);
Und voilà:
[Dateianhang nicht öffentlich]
Wenn du damit Schwierigkeiten hast, dann melde dich.
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 09:57 Mo 06.11.2006 | Autor: | mjh53 |
guten morgen...
habe deine antwort gerade gelesen und bin mal wieder am durcharbeiten, um zu verstehen!!! ... MiniFrage: wenn datenum das datum in tage umwandelt, welche funktion liefert mir dann das Ergebnis in Sekunden???
Gruss
mathias
|
|
|
|
|
Hallo,
ich weiß von keiner solchen Funktion. Aber man könnte es ja mal mit 86400*datenum(...) versuchen ;)
Na ja, datenum liefert nicht nur ganze Tage, sondern doubles. D.h. die kleineren Zeiteinheiten gehen nicht verloren. Man muss sie nur herauskitzeln.
Gruß
Martin
|
|
|
|
|
Hallo,
du hast Recht, das ist sozusagen super easy. Wir müssen nur sagen, was wir übriglassen wollen, nicht, was wir löschen wollen.
Sei also data unsere Matrix, dann finden wir die Zeilenindizes mit (4. Spalte <= 16) mittels:
find(data(:,4) <= 16)
Die Matrix, die nur noch die gewünschten Zeilen enthält sieht so aus:
data(find(data(:,4) <= 16), :)
Natürlich kannst du den ersten Teil in einer Variablen speichern und diese dann in die zweite Zeile einfügen, aber wenn du die Indizes eh nicht brauchst, reicht nur die zweite Zeile...
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:05 Di 07.11.2006 | Autor: | mjh53 |
Hallo,
es sieht alles ganz gut aus... ich musste dein vorschlag an meine vorgaben etwas anpassen... deine rand-zahlen waren ja erstmal unabhängig von der zeit... ich habe ein datenpaar, das voneinander abhängig ist...aber ich habe das einigermaßen anpassen können...
allerdings ist der graph sehr unübersichtlich, ich schick ihn dir als anhang mit... die osszillation ist super groß, meine Frage nun...gibt es funktionen, die das mittel ploten, oder einen laufenden durchschnitt, so wie bei den Aktienkursen auch...
gruss
mathias
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: fig) [nicht öffentlich]
|
|
|
|
|
Hallo,
da kann ich dir zum Einen die Hilfe zur Funktion "smooth" ans Herz legen. Damit kenne ich mich zwar nicht besonders aus, sieht aber ziemlich vielversprechend aus.
Zum Anderen wäre ein laufender Durchschnitt kein Problem. Den müsste man selber ausrechnen und plotten, wäre aber nicht schwer:
Mittelung über L Datenpunkte (L ungerade) des Datensatzes data:
for i=(L+1)/2:size(data,2)-(L-1)/2,
avgdata(i) = 1/L*sum(data(i-(L-1)/2:i+(L-1)/2));
end;
Zu beachten ist nur, dass der avgdata-Datensatz L-1 weniger Datenpunkte umfasst und beim Plotten versetzt werden muss.
Das Ganze sieht dann (mit Zufallsdaten) so aus (rot=3er-Durchschnitt)
[Dateianhang nicht öffentlich]
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:50 Do 09.11.2006 | Autor: | mjh53 |
hallo,
ich bin nun zu meiner ersten schleife vorgedrungen, und wie soll es anders sein... Problemchen... der code steht in der angehängten datei, und funktioniert nicht... nach mehrstündigem suchen, nun die bitte zur hilfe...
was stimmt nicht..??
inzwischen hat sich eine weitere Frage aufgetan...relativ allgemein...zu folgender Schleife...
%clear
%TWS=[1:300];
%n=1;
%x=100;
%for i=n:2
% TWS_(i)=TWS(x-9:x)
%hold on
[mm] %plot(TWS_1,'o') [/mm]
%x=x+100;
%end
ich würde gerne zwei Variablen kreieren... also [mm] TWS_1 [/mm] und [mm] TWS_2... [/mm] geht so wohl nicht... mmmmm??????
gruss
mathias
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Hallo,
ich habe mir das mal angeschaut. Dann gehen wir mal deinen Code durch:
Timevec=[1:799];
Hier definierst du einen Vektor mit den Zeitangaben 1.1.0000, 2.1.0000, usw. Vergiss nicht, dass die Zahlen für Tage stehen. Wenn du Sekunden haben willst, musst du das entsprechend umrechnen.
x=100;
m=fix(length(TWS)/x);
Auch ohne fix() sollte die for-Schleife im richtigen Moment abbrechen.
for i=1:m
TWS_1=TWS(x-99:x);
Timevec_1=Timevec(x-99:x);
startzeit = Timevec_1(x-99);
Es sollte wohl "startzeit = Timevec(x-99);" heißen!
endzeit = Timevec(x);
markT = startzeit:1/144:endzeit;
Da du den Zeitraum in Tagen definiert hast, bekommst du hier 99*144+1 Markierungen. Das ist ein Folgefehler. Also Timevec richtig definieren.
Der Rest des Codes ist fehlerfrei.
Also nochmal:
Am besten erzeugst du deinen Timevec so:
sdate = datenum(2006,11,9,18,30,0);
edate = datenum(2006,11,10,18,30,0);
Timevec = sdate : (edate-sdate)/798 : edate
Das Datum kann man natürlich auch auf 0.0.0000 setzen. Wichtig ist nur, dass die Uhrzeiten stimmen.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:59 Do 09.11.2006 | Autor: | mjh53 |
hallo...
super... alles klar... vielen Dank....
wärend du meine erste Frage beantwortet hat... hat sich schon die nächste aufgetan...
m-file-Anhang.....
Frage dazu... kann ich in einer for-schleife... zwei Variablen kreieren, so dass ich diese dann außerhalb der schleife weiterverwenden kann...
hier würde ich gerne [mm] TWS_1 [/mm] und [mm] TWS_2 [/mm] kreieren.... erster gedanke war einfach an das TWS_ ein i anzuhängen... also [mm] TWS_i [/mm] ... aber das ist nicht möglich....
Gruss
mathias
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Hallo,
ich rate mal, was du willst:
Ersetze die erste Zeile in der for-Schleife durch:
TWS_(i,1:10)=TWS(x-9:x)
Entsprechend musst du den Plot ändern:
plot(TWS_(i,1:10),'o')
Es ist eben wichtig, dass man bei einer Zuweisung auf beiden Seiten gleich große Matrizen definieren muss.
Ist es das, was du wolltest?
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:28 Do 09.11.2006 | Autor: | mjh53 |
hallo...
nicht ganz.... was ich gerne hätte ist folgende situation... nach durchlaufen der schleife, also mit i=1 und i=2.... möchte ich zugriff haben auf beide Variablen...so dass sie im Workspace stehen... bestenfalls mit [mm] TWS_1 [/mm] und [mm] TWS_2.... [/mm]
mir ist gerade klar geworden, dass ich natürlich die kreierte Matrix TWS_ aufteilen kann... ist aber dann mehr arbeit und geschieht nicht in der Schleife... ist das verständlich???...
gruss
mathias
|
|
|
|
|
Hallo,
das Zuweisen in der Schleife könnte man so bewerkstelligen:
assignin('base', sprintf('TWS_%d',i) , TWS(x-9:x));
Nun gibt es im Workspace die Variablen TWS_1 und TWS_2.
Ein Zugriff über nur einen Index wie TWS(1) ist nicht möglich, weil man auf einen Datenvektor nur über eine Indexfolge zugreifen kann. Das wäre dann wieder etwas wie TWS(1,1:10).
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:13 Fr 10.11.2006 | Autor: | Martin243 |
Habe nur einen Fehler in TXTassign.m gefunden und gefixt. Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:38 Mi 10.01.2007 | Autor: | Martin243 |
Kleiner Bugfix, der Fehler hätte sich aber lautstark bemerkbar gemacht, wenn man betroffen gewesen wäre.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:16 Di 14.11.2006 | Autor: | mjh53 |
Hallo...
VielenDank für deine Korrektur... was genau hat sich denn jetzt geändert?? mmmhhh
Eine weiteres Problem.... ich habe nun ein Schaubild (figure) kreiert... siehe Anhang... Datei-Anhang
Es stellt die Windgeschwindigkeit über der Zeit dar... was ich nun gerne hätte, ist auf einer horizontale Linie über dem Schaubild, periodisch (anbieten würden sich z.B xtick-abstände) unterbrochen durch Pfeile, die die Windrichtung anzeigen... ist das verständlich... ich möchte an einem xtick-punkt also drei Informationen in einem Schaubild darstellen... Windrichtung, Windgeschwindigketi, Zeitpunkt...
Gruss
mathias
Dateianhänge: Anhang Nr. 1 (Typ: fig) [nicht öffentlich]
|
|
|
|
|
Hallo,
ich war etwas länger nicht mehr online...
> VielenDank für deine Korrektur... was genau hat sich denn jetzt
> geändert?? mmmhhh
Nun, das Problem war, dass bei Tabellen ohne Überschrift (bei denen man also die Variablennamen übergeben musste) immer die erste Zeile verschluckt wurde. Es fehlte also der erste Datensatz. Jetzt gibt es dafür die Variable hasHeader.
> unterbrochen durch Pfeile
Mit Pfeilen kann ich nicht dienen (außer selbstgezeichneten), aber was hältst du davon (OK, Überschrift ist verschoben, die müsstest du neu setzen, und die horizontale Linie ist nicht unterbrochen, aber das ist das kleinste Problem):
[Dateianhang nicht öffentlich]
Das kann man folgendermaßen realisieren:
hold on;c=0;
ax = axis; wid=ax(2)-ax(1);hei=ax(4)-ax(3);win=360*rand(7);
plot([ax(1) ax(2)], [ax(4)+hei/8 ax(4)+hei/8]);
plot(ax(1):1/144:ax(2), ax(4)+hei/8,'ro');
for i=ax(1):1/144:ax(2),
c=c+1;
plot([i i+cos(pi/180*(90-win(c)))*wid/20],[ax(4)+hei/8 ax(4)+hei/8+sin(pi/180*(90-win(c)))*hei/20],'r');
end;
axis([ax(1:3) ax(4)+hei/4]);
Ach ja, win ist mein Winkeldatensatz.
Ich hoffe, es hilft dir weiter...
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 11:05 Do 16.11.2006 | Autor: | mjh53 |
Guten morgen,
davon halte ich sehr viel... exakt was ich benötige ... vielen dank..
allerdings tue ich mir mit dem code etwas schwer... die plot-zeile in der for-schleife übersteigt natürlich meinen Leistungsstand...
ich möchte diese Möglichkeit etwas an mein anliegen anpassen... was ich gerne machen würde, ist ja wie gesagt, in einem Schaubild drei Informationen darzustellen... Windgeschwindigkeit, Windrichtung und die zugehörige Zeit... ich habe von diesen drei variablen, drei vektoren mit derselben länge... die gewünschte windrichtungsanzeige von z.B xtick(2) sollte der Durchschnitt der windrichtungs-Werte aus dem Intervall [xtick(2)- ([xtick(2)-xtick(1)]/2) xtick(2)+ ([xtick(3)-xtick(2)]/2)] sein...
dein code, so wie ich ihn verstehe, generiert ja zufallswinkel, aus denen dann ausgewählt wird!?? ist das so?? ich möchte aber ja wie beschrieben konkrete zugehörige (berechnete) Daten (Winkel) verwenden.... wie kann ich nun dies in deinen code einbauen???
gruss
mathias
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:25 Mo 20.11.2006 | Autor: | Martin243 |
Hallo,
ich war das Wochenende über weg...
Die plot-Anweisung sieht vielleicht etwas unafgeräumt aus, aber es liegt daran, dass dort "on the fly" der Strich, der die Kompassnadel darstellt, berechnet wird.
Zu den Zufallswinkeln:
Ich erzeuge mir im Vorfeld ein Array mit so vielen Winkeln wie ich xticks habe (bei der 7 habe ich mich vertan, sollte 4 heißen!). In der for-Schleife wähle ich mit c nur jeweils den passenden Winkel aus. Das heißt, in jedem Schleifendurchlauf gehe ich einen xtick weiter und zeichne die Kompassnadel. (Die Kreise werden ja alle auf einmal vor der Schleife gezeichnet.)
Was dir zu tun bleibt:
Berechne im Voraus die Durchschnittswinkel und lege sie in dem Array win ab. Wichtig ist nur, dass die Anzahl dieser Winkel der Anzahl der xticks entspricht.
Bei der Berechnung musst du natürlich darauf achten, dass beim ersten und beim letzten Durchschnittswert das Intervall jeweils nur halb so groß ist, weil man beim ersten xtick nicht weiter nach links und beim letzten xtick nicht weiter nach rechts kann.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:25 Do 23.11.2006 | Autor: | mjh53 |
hallo,
eine Frage zur Darstellung einer Kurve... im Moment stelle ich in einem Schaubild zwei Kurven über der Zeit dar... ich hatte zu beginn probleme dies tun zu können... die Lösung war dann, dass ich für beide kurven denselben Zeitvektor benutzt habe... dies bringt mich jetzt allerdings in Schwierigkeiten, da ich die eine Kurve zeitversetzen möchte, um z.B 10 Minuten... gibt es dafür eine einfache Lösung?
gruss
mathias
|
|
|
|
|
Hallo,
addiere (oder subtrahiere) doch zum x-Vektor des Plots die gewünschte Verschiebung. Vergiss dabei nicht, dass 10 min dabei 1/24/6 sind!
Wenn der Plot also vorher so aussah:
plot(startzeit:(endzeit-startzeit)/(size(kurs,2)-1):endzeit,kurs);
dann sollte er jetzt so aussehen:
plot([startzeit:(endzeit-startzeit)/(size(kurs,2)-1):endzeit]-1/24/6,kurs);
Es geht:
[Dateianhang nicht öffentlich]
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:10 Mo 27.11.2006 | Autor: | mjh53 |
hallo,
mein letztes problem war ja mal wieder ein super einfaches anfängermissunderstanding... aber umsobesser!! danke dafür...
heute zielt meine frage nochmal auf die darstellung einer figure ab...
mein noch nicht umsetzbarer wunsch ist... ich führe eine nebenrechnung
durch und würde das ergebnis gerne irgendwo im schaubild unterbringen...
z.B a=2, b=4, a+b=x
im schaubild möchte ich dann haben breite: x=6
gruss
mathias
|
|
|
|
|
Hallo,
mal angenommen, du möchtest den Text im aktuellen Plot (also nach eine hold on) an Punkt (10,20) platzieren, dann reicht Folgendes:
a=2;b=4;
x = a+b;
text(10, 20, sprintf('breite: x=%g', x));
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:22 Mo 27.11.2006 | Autor: | mjh53 |
hallo..
da hatte mich die informationsflut der matlabhilfe wohl erschlagen...
trotzdem eine kleine Frage dazu...
erstens... ist es möglich das ergebnis, also breite: x=6 in einer zweiten legend darzustellen... wenn das gehen sollte, ziehe ich das vor, wenn nicht, würde ich die Darstellung einheitlich in der unteren linken Ecke, oder sogar überhalb des koordinatensysems, dann links oder rechts... haben wollen... mmmm.... kann ich also die x, y-angabe unagbhängig von dem Graphen machen...
Gruss
mathias
|
|
|
|
|
Hallo,
du kannst natürlich die Ausgabe von sprintf in einer Variablen speichern und in die alte Legende aufnehmen oder eine neue Legende erzeugen.
Wenn du es mit text machen möchtest, dann kannst du doch mit axis die min- und max-Werte der Achsen abfragen.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:54 Di 28.11.2006 | Autor: | mjh53 |
hallo,
das ergebnis in eine bestehende legende habe ich nicht geschafft, und wie ich eine zweite legende in ein schaubild bringe leider auch nicht... meine lösung ist, dass ich nun das ergebnis im title mit ausgebe... das gefällt mir einigermaßen...
title(['Schaubild eines Gwschwindigkeitsfeldes (breite: ',br, 'km, länge: ',lae,' km)'],'Fontsize',12); ...
frage dazu, kann ich den teil im titel in klammern mit einer fontsize von nur 10 anzeigen lassen..???
sollte ich noch einen tipp bekommen, wie das mit den legends vorsich geht, wäre ich sehr froh....
danke
gruß
mathias
|
|
|
|
|
Hallo,
> kann ich den teil im titel in klammern mit einer fontsize von nur 10 anzeigen lassen..???
Nun, je nach Matlabversion kann man mitten im Text die Schritfgröße mit \fontsize(xx) ändern. Bei mir funktioniert es aber nur sporadisch...
> wie das mit den legends vorsich geht,
Hmmm, man kann wohl nur eine Legende erzeugen, aber die kann natürlich mehrzeilig sein.
Nachträglich kann man den Text der Legende auch verändern:
[egal,legChildren,egal,egal] = legend({'Die','alte','Legende'});
%10000 Zeilen Code
set(legChildren(1),'String',{'Die','neue','Legende'});
Mit mehr kann ich nicht dienen.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 07:34 Mi 07.05.2008 | Autor: | Pete2008 |
Hallo,
ich beschäftige mich zur Zeit ebenfalls mit Excel und Matlab.
Habe dein Code kopiert und es klappt auch fast alles.
Nur die else-Funktion gibt einen Fehler aus.
Woran kann das liegen?
Dateianhänge: Anhang Nr. 1 (Typ: xls) [nicht öffentlich] Anhang Nr. 2 (Typ: xls) [nicht öffentlich]
|
|
|
|
|
Hallo,
es gibt zwei Probleme: Die Variablennamen sind unterschiedlich lang und es kommen zum Teil Leerzeichen darin vor. Also ergänzen wir den letzten Teil zu:
for col=1:size(varNames,1),
if isnan(nums(1,col)) %erstes Datenwort nicht numerisch?
assignin('base',strrep(deblank(varNames(col,:)),' ','_'),char(txt(2:end,col))); %Zuweisen der Strings in der Spalte
else %falls doch numerisch?
assignin('base',strrep(deblank(varNames(col,:)),' ','_'),nums(:,col)); %Zuweisen der Zahlen in der Spalte
end;
end;
Damit müsste es gehen.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 16:39 Di 24.06.2008 | Autor: | Bertram |
Hallo Martin,
ich habe ein ähnliches Problem wie der Anfangsfragesteller und mit deinem Lösungsvorschlag für Excel fast gelöst. Hast Du auch eine Idee wie man unterschiedlich lange Spaltenüberschriften in den Griff bekommt? Wo genau liegt denn das Problem, wenn verschieden lange "varNames" an assignin übergeben werden?
Viele Grüße,
Bertram
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:22 Do 26.06.2008 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|