Vermeiden Sie das Eingeben von Konvertierungsspezifizierern für jede Spalte in großer Tabelle in "textScan`

StackOverflow https://stackoverflow.com/questions/8805685

  •  26-10-2019
  •  | 
  •  

Frage

Ich lese Daten aus einer Tabelle mithilfe textscan(). Die Tabelle verfügt über 90 Spalten und ich möchte die Werte jeder Spalte als schwimmende Punktzahl lesen. Wenn ich mich die Dokumentation anschaue, muss ich den Spezifizierer verwenden %f - Aber es scheint, dass ich es 90 Mal benutzen muss, also habe ich das am Ende:

c = textscan(fid,'%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
                  %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
                  %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
                  %f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f');

Was im Grunde genommen funktioniert, aber ich frage mich, ob es einen Weg gibt, um ein Eintippen für jede Spalte, die ich in meiner Tabelle habe, zu vermeiden.

War es hilfreich?

Lösung

Verwenden repmat So erstellen Sie Ihre Formatzeichenfolge basierend auf der Anzahl der Spalten.

nCols = 60;
format = repmat('%f', [1 nCols]);
c = textscan(fid, format);

Dies ist flexibel genug, um zu verwenden, wenn Sie ein paar Saitenspalten gemischt haben.

nNumberCols = 58;
format = ['%s%s' repmat('%f', [1 nNumberCols])];
c = textscan(fid, format);

Andere Tipps

Für eine sehr einfache ASCII -Datei, die aus 90 Spalten mit schwimmenden Punktnummern besteht, die durch einen bekannten Trennzeichen getrennt sind, wäre es möglicherweise einfacher, die MATLAB -Funktion zu verwenden dlmread.

Zum Beispiel, wenn Ihre Datei rand.txt lautet:

0.8147    0.0975    0.1576    0.1419    0.6557
0.9058    0.2785    0.9706    0.4218    0.0357
0.1270    0.5469    0.9572    0.9157    0.8491
0.9134    0.9575    0.4854    0.7922    0.9340
0.6324    0.9649    0.8003    0.9595    0.6787

Sie können verwenden: randmat=dlmread('rand.txt');

Sie können einfach einen Textscan mit nur einem "%f" machen und ihn dann nach möchten oder in Zelle konvertieren, wie Sie möchten:

fid=fopen('bla.txt','r');
M=textscan(fid,'%f')
M=reshape(M{1},[],5)
M=num2cell(M,1)
fclose(fid);

Ich würde die Verwendung vorschlagen:

fileId=fopen('fileloc.txt');
formatSpec='%f';
N=90;
data=textscan(fileId,formatSpec,N);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top