Попытка прочитать текстовый файл ... но не получить все содержимое - PullRequest
0 голосов
/ 16 марта 2012

Я пытаюсь прочитать файл в следующем формате, который повторяется (но я обрезал данные даже для первого повторения, потому что он слишком длинный):

1.00 'day' 2011-01-02
'Total Velocity Magnitude RC - Matrix' 'm/day'
    0.190189     0.279141     0.452853      0.61355     0.757833     0.884577 
    0.994502      1.08952      1.17203      1.24442      1.30872      1.36653 
     1.41897      1.46675      1.51035      1.55003      1.58595      1.61824

Загрузите актуальный файл с полными данными здесь

Это мой код, который я использую для чтения данных из вышеуказанного файла:

fid = fopen(file_name); % open the file

dotTXT_fileContents = textscan(fid,'%s','Delimiter','\n'); % read it as string ('%s') into one big array, row by row
dotTXT_fileContents = dotTXT_fileContents{1};
fclose(fid); %# don't forget to close the file again

%# find rows containing 'Total Velocity Magnitude RC - Matrix' 'm/day'
data_starts = strmatch('''Total Velocity Magnitude RC - Matrix'' ''m/day''',...
    dotTXT_fileContents); % data_starts contains the line numbers wherever 'Total Velocity Magnitude RC - Matrix' 'm/day' is found

ndata = length(data_starts); % total no. of data values will be equal to the corresponding no. of '**  K' read from the .txt file

%# loop through the file and read the numeric data
for w = 1:ndata-1
    %# read lines containing numbers
    tmp_str = dotTXT_fileContents(data_starts(w)+1:data_starts(w+1)-3); % stores the content from file dotTXT_fileContents of the rows following the row containing 'Total Velocity Magnitude RC - Matrix' 'm/day' in form of string
    %# convert strings to numbers
    tmp_str = tmp_str{:}; % store the content of the string which contains data in form of a character
    %# assign output
    data_matrix_grid_wise(w,:) = str2num(tmp_str); % convert the part of the character containing data into number
end

Чтобы дать вам представление о структуре данных в моем текстовом файле, вот некоторые результаты из кода:

data_starts =

           2
        1672
        3342
        5012
        6682
        8352
       10022

ndata =

     7

Следовательно, мой data_matrix_grid_wise должен содержать 1672-2-2-1(for a new line)=1667 строк.Тем не менее, я получаю это в результате:

data_matrix_grid_wise =

  Columns 1 through 2

   0.190189000000000   0.279141000000000
   0.423029000000000   0.616590000000000
   0.406297000000000   0.604505000000000
   0.259073000000000   0.381895000000000
   0.231265000000000   0.338288000000000
   0.237899000000000   0.348274000000000

  Columns 3 through 4

   0.452853000000000   0.613550000000000
   0.981086000000000   1.289920000000000
   0.996090000000000   1.373680000000000
   0.625792000000000   0.859638000000000
   0.547906000000000   0.743446000000000
   0.562903000000000   0.759652000000000

  Columns 5 through 6

   0.757833000000000   0.884577000000000
   1.534560000000000   1.714330000000000
   1.733690000000000   2.074690000000000
   1.078000000000000   1.277930000000000
   0.921371000000000   1.080570000000000
   0.934820000000000   1.087410000000000

Где я не прав?В моем конечном результате я должен получить data_matrix_grid_wise, состоящий из 10000 элементов вместо 36 элементов.Спасибо.

Обновление: Как я могу включить число перед «днем», т.е. 1,2,3 и т. Д., В строку непосредственно перед data_starts (w)?Я использую это в цикле, но он не работает:

days_str = dotTXT_fileContents(data_starts(w)-1);
    days_str = days_str{1};
    days(w,:) = sscanf(days_str(w-1,:), '%d %*s %*s', [1, inf]);

Ответы [ 2 ]

1 голос
/ 09 апреля 2012

Проблема в строке tmp_str = tmp_str {:}; У Matlab странное поведение при обработке символов. Короткое решение для вас - заменить последнюю на следующие две строки:

y = cell2mat( cellfun(@(z) sscanf(z,'%f'),tmp_str,'UniformOutput',false));
data_matrix_grid_wise(w,:) = y;
1 голос
/ 09 апреля 2012

Проблема с последними 2 утверждениями. Когда вы делаете tmp_str{:}, вы конвертируете массив ячеек в список строк через запятую. Если вы назначите этот список одной переменной, будет назначена только первая строка. Таким образом, tmp_str теперь будет иметь только первую строку данных.

Вот что вы можете сделать вместо двух последних строк:

tmp_mat = cellfun(@str2num, tmp_str, 'uniformoutput',0);
data_matrix_grid_wise(w,:) = cell2mat(tmp_mat);

Однако у вас будет проблема с конкатенацией (cell2mat), поскольку не во всех ваших строках одинаковое количество столбцов. Это зависит от вас, как решить это.

...