2012-01-10 5 views
7

Czytam dane z tabeli przy użyciu textscan(). Tabela ma 90 kolumn i chcę odczytać wartości każdej kolumny jako liczbę zmiennoprzecinkową. Patrząc na dokumentacji, muszę używać specyfikatora %f - ale wydaje się, że trzeba używać go 90 razy, więc skończyć z tym:Unikaj wpisywania specyfikatora konwersji dla każdej kolumny w dużej tabeli w `textscan`

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'); 

które zasadniczo działa, ale zastanawiam się, czy istnieje jakiś sposób dookoła, aby uniknąć wpisywania specyfikatora dla każdej kolumny, którą mam w mojej tabeli.

Odpowiedz

11

Zastosowanie repmat zbudować ciąg formatu w zależności od liczby kolumn.

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

Jest na tyle elastyczny, że można go użyć, jeśli np. A kolumny pary strun mieszać w

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

Doskonale, dokładnie tego potrzebuję, okrzyki! –

3

Dla bardzo prostego pliku ASCII złożonego z 90 kolumn liczb zmiennoprzecinkowych oddzielonych znanym ogranicznikiem, być może łatwiej byłoby użyć funkcji Matlab dlmread.

Na przykład, jeśli plik jest rand.txt:

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 

Można użyć: randmat=dlmread('rand.txt');

+0

Hmm ale to rozwiązanie odczytuje dane do matrycy, a muszę ją przeczytać do tablicy komórek, a także przy użyciu 'FID 'identyfikator (który ma' textscan'). –

+0

Możesz przekonwertować matrycę na macierz komórek za pomocą funkcji [mat2cell] (http://www.mathworks.fr/help/techdoc/ref/mat2cell.html). Jeśli chodzi o identyfikator pliku, często jest tak, że nazwa pliku jest również dostępna, jeśli nie jest to w kontekście twojego problemu, wtedy odpowiedzi Andrew Janke i Oli'a będą działały dobrze. To tylko alternatywa. – Aabaz

2

Można po prostu zrobić textscan tylko z jednym „% f”, a następnie przekształcić go jak chcesz lub przekształcenie go do celi, jak chcesz:

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

Proponuję użyć:.

fileId=fopen('fileloc.txt'); 
formatSpec='%f'; 
N=90; 
data=textscan(fileId,formatSpec,N); 
+0

Ten kod będzie czytany tylko w pierwszym wierszu. Będziesz musiał zapętlić go, aby przeczytać we wszystkich liniach pliku. – goryh

Powiązane problemy