Как прочитать файл с использованием текстов? - PullRequest
0 голосов
/ 05 августа 2010

У меня большой файл с разделителями табуляции (10000 строк, 15000 столбцов), и я хотел бы импортировать его в Matlab.

Я попытался импортировать его с помощью функцииъкантования текста следующим образом:

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} - это строка, описывающая типы переменных для каждого столбца (в данном случае имеется 14740 переменных с плавающей запятой и 260 строковых переменных, поэтому значение AttributeTypes {1, 1} равно '% f% f......% f% s% s ...% s, где% f повторяется 14740 раз и% s 260 раз).

Когда я пытаюсь выполнить

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

заголовок массив представляется правильным (имена столбцов прочитаны правильно).

данные - это массив 1 x 15000 (вместо первой импортирована первая строка10000) и не знаю, что является причиной такого поведения.

Я думаю, что проблема вызвана этой строкой:

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

, но не знаю, что может быть не так, потому что естьподобный пример описан в справочной справке.

Я был бы очень благодарен, если бы кто-нибудь из вас предложилисправить проблему - Как прочитать все 10000 строк.

1 Ответ

2 голосов
/ 05 августа 2010

Я верю, что все ваши данные там. Если вы заглянете внутрь data, каждая ячейка должна содержать весь столбец (10000x1). Вы можете извлечь i-ю ячейку в виде массива с помощью data{i}.

Возможно, вы захотите разделить двойные и строковые данные. Я не знаю, что такое attributeFormats, вы, вероятно, можете использовать этот массив. Но вы также можете использовать AttributeTypes{1, 1}.

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

Чтобы объединить строковые данные в один массив строк, вы можете сделать:

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