Импорт текстового файла в Matlab, размер не поддерживается

Я пытаюсь загрузить текстовый файл в Matlab в виде матрицы, а затем обработать на основе пользовательского ввода, чтобы выбрать выбранные данные.

Это первые несколько строк данных.

The United States of America, Deaths (1x1)     Last modified: 16-Nov-2012, MPv5 (May07)

Year     Age        Female             Male            Total
1933      0          52615.77         68438.11        121053.88
1933      1           8917.13         10329.16         19246.29
1933      2           4336.92          5140.05          9476.97
1933      3           3161.59          3759.88          6921.47
1933      4           2493.84          2932.59          5426.43
1933      5           2139.87          2537.53          4677.40
1933      6           1939.70          2337.76          4277.46
1933      7           1760.47          2163.90          3924.37
1933      8           1602.20          2015.97          3618.17
1933      9           1464.88          1893.96          3358.84

Большая часть данных представлена ​​здесь: https://www.dropbox.com/s/b4njypwmrxwxzl7/USA.Deaths_1x1.txt?dl=0

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я использую T=readable() для чтения данных, размерность T равна таблице m x 1, а не таблице m x 5.

Я также пытался изменить файл txt в файл csv, но данные содержат нечисловые записи.

Что я мог сделать, чтобы решить эту проблему?

Спасибо.


person Bill Li    schedule 25.06.2015    source источник
comment
просмотрите документ для importdata, затем попробуйте: datatable=importdata('USA.Deaths_1x1.txt',' ',3)   -  person Hoki    schedule 26.06.2015
comment
@ Хоки, ты знаешь, почему он импортировал только 111 строк, а не все 10000+ строк?   -  person Bill Li    schedule 26.06.2015
comment
да, формат импорта споткнулся при первом же сбое. Я сделал более надежный ответ (он импортирует весь файл), но несколько строк остаются ошибочными (для стариков, бедных).   -  person Hoki    schedule 26.06.2015
comment
Я думаю, что он импортирует только 111-ю строку, потому что 111-е данные для возраста — это 110+, что не является числовым. У меня есть возраст 110+ для каждого года, так что это примерно один в каждой строке 111   -  person Bill Li    schedule 26.06.2015
comment
Можете ли вы показать мне, что вы придумали? Спасибо   -  person Bill Li    schedule 26.06.2015


Ответы (1)


Для вашего формата данных большинство прямых функций импорта (importdata, dlmread и т. д.) не сработают.

textscan имеет несколько параметров, которые позволят вам импортировать полный файл, не прерывая его. первая неправильная строка, однако несколько ошибочных строк будут содержать NaN.

%// Define special values which can be encoutered
specialValues = {'110+','other_special_values'} ;
formatSpec = '%n%n%f%f%f' ;

%// Read the file, treating special values 
fileID = fopen('USA.Deaths_1x1.txt');
C = textscan(fileID, formatSpec, ...
    'delimiter'     , ' ', ...
    'headerlines'   ,3, ...
    'treatAsEmpty'  , specialValues, ...
    'MultipleDelimsAsOne',1 );

fclose(fileID);

%// Convert cell array to matrix
data = cell2mat(C) ;

Если вам действительно нужны данные о неисправных линиях, вам придется написать более настраиваемый синтаксический анализатор с низкоуровневой функцией fscanf и учитывать каждый пограничный случай (нетрадиционная линия), с которым вы можете столкнуться.

person Hoki    schedule 25.06.2015
comment
Большое спасибо, я попробую - person Bill Li; 26.06.2015