2010-08-05 23 views
0

J'ai un grand fichier délimité par des tabulations (10000 lignes, 15000 colonnes) et j'aimerais l'importer dans Matlab.Comment lire un fichier en utilisant textscan?

J'ai essayé de l'importer en utilisant la fonction textscan de la manière suivante:

function [C_text, C_data] = ReadDataFile(filename, header, attributesCount, delimiter, 

attributeFormats, attributeFormatCount) 
AttributeTypes = SetAttributeTypeMatrix(attributeFormats, attributeFormatCount); 
fid = fopen(filename); 
if(header == 1) 
    %read column headers 
    C_text = textscan(fid, '%s', attributesCount, 'delimiter', delimiter); 
    C_data = textscan(fid, AttributeTypes{1, 1}, 'headerlines', 1); 
else 
    C_text = ''; 
    C_data = textscan(fid, AttributeTypes{1, 1}); 
end 


fclose(fid); 

AttributeTypes {1, 1} est une wich chaîne décrit les types de variables pour chaque colonne (dans ce cas, il y a 14740 flotteur et 260 variables de type chaîne de sorte que la valeur de AttributeTypes {1, 1} est '% f% f ......% f% s% s ...% s où% f est répété 14740 fois et% s 260 fois) .

Lorsque je tente d'exécuter

>> [header, data] = ReadDataFile('data/orange_large_train.data.chunk1', 1, 15000, '\t', types, size); 

tête tableau semble être correct (les noms de colonnes ont été lus correctement).

data est un tableau 1 x 15000 (seule la première ligne a été importée au lieu de 10000) et ne sait pas ce qui cause un tel comportement.

Je suppose que le problème est causé dans cette ligne:

C_data = textscan(fid, AttributeTypes{1, 1}); 

mais je ne sais pas ce qui pourrait être mal parce qu'il est un exemple similaire à celui décrit dans la référence de l'aide.

Je serais très reconnaissant si quelqu'un d'entre vous suggéré une solution pour le problème - Comment lire toutes les 10000 lignes.

Répondre

2

Je crois que toutes vos données sont là. Si vous regardez à l'intérieur data, chaque cellule doit contenir toute la colonne (10000x1). Vous pouvez extraire une i-ième cellule sous la forme d'un tableau avec data{i}.

Vous voudrez probablement séparer les données doubles et les chaînes. Je ne sais pas ce qui est attributeFormats, vous pouvez probablement utiliser ce tableau. Mais vous pouvez également utiliser le AttributeTypes{1, 1}.

isdouble = strfind(AttributeTypes{1, 1}(2:2:end),'f'); 
data_double = cell2mat(data(isdouble)); 

Pour combiner les données de chaîne dans un réseau de cellules de chaînes que vous pouvez faire:

isstring = strfind(AttributeTypes{1, 1}(2:2:end),'s'); 
data_string = horzcat(data{isstring});