как перебрать данные xlsx в октаве со смешанными типами - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь прочитать простой файл xlsx с xlsread в октаве. Его версия CSV показана ниже:

2,4,abc,6
8,10,pqr,12
14,16,xyz,18

Я пытаюсь прочитать и написать содержимое с помощью этого кода:

[~, ~, RAW] = xlsread('file.xlsx');
allData = cell2mat(RAW);  # error with cell2mat()
printf('data nrows=%d, ncolms=%d\n', rows(allData), columns(allData));
for i=1:rows(allData)
   for j=1:columns(allData)
      printf('data(%d,%d) = %d\n', i,j, allData(i,j));
   endfor
endfor

и я получаю следующую ошибку:

error: cell2mat: wrong type elements or mixed cells, structs, and matrices

Я экспериментировал с несколькими вариантами этой проблемы:

(A) Если я удаляю столбец с текстовыми данными, т.е. файл xlsx содержит только цифры, то этот код работает нормально.

(B) С другой стороны, если я удаляю вызов cell2mat () даже для чисто числа xlsx, я получаю сообщение об ошибке при доступе к ячейке:

error: printf: wrong type argument 'cell'

(C) Если я использую cell2mat () во время printf, например:

printf('data(%d,%d) = %d\n', i,j, cell2mat(allData(i,j)));

Я получаю правильные данные для целых чисел и мусор для текстовых элементов.

Итак, как я могу получить доступ и распечатать каждую ячейку данных xlsx, если xlsx содержит данные смешанного типа?

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

1 Ответ

0 голосов
/ 03 июля 2018

Числовой массив не может содержать данные нескольких классов, поэтому cell2mat завершается ошибкой. Массивы ячеек используются для хранения данных такого типа, и они уже есть в массиве ячеек, поэтому не требуется преобразование , поэтому просто пропустите эту строку (allData = cell2mat(RAW);).

В цикле у вас есть эта строка:

printf('data(%d,%d) = %d\n', i, j, allData(i,j) );
%                      ↑                  ↑   ↑ 
%                      1                 2a   2b

Проблемы обозначены стрелками вверх.

  1. Вы смешали данные в массиве ячеек, но вы используете %d в качестве спецификатора данных. Вы можете исправить это, преобразовав все ваши данные в строку, а затем использовать % s в качестве спецификатора.
  2. Если вы используете квадратные скобки ( ) для индексации массива ячеек, вы получите ячейку. Здесь вам нужно содержимое этой ячейки и для этого используются фигурные скобки { }.

Так будет:

printf('data(%d,%d) = %s\n', i,j, num2str(RAW{i,j}));

Обратите внимание, что вместо всего этого вы можете просто ввести RAW, чтобы получить это:

octave:1> RAW
RAW = 
{
  [1,1] =  2
  [2,1] =  8
  [3,1] =  14
  [1,2] =  4
  [2,2] =  10
  [3,2] =  16
  [1,3] = abc
  [2,3] = pqr
  [3,3] = xyz
  [1,4] =  6
  [2,4] =  12
  [3,4] =  18
}
...