Как загрузить 2D массив из текстового (CSV) файла в Octave? - PullRequest
0 голосов
/ 15 декабря 2011

Рассмотрим следующий текстовый (CSV) файл:

1, Some text
2, More text
3, Text with comma, more text

Как загрузить данные в двумерный массив в Octave?Число может идти в первый столбец, а весь текст справа от первой запятой (включая другие запятые) - во второй текстовый столбец.

При необходимости я могу заменить первую запятую другим разделителемхарактер.

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

AFAIK, вы не можете помещать в массиве строки разных размеров. Вам нужно создать так называемый массив ячеек .

Возможный способ прочитать данные из вашего вопроса, хранящиеся в файле Test.txt , в массив ячеек:

t1 = textread("Test.txt", "%s", "delimiter", "\n");
for i = 1:length(t1)
    j = findstr(t1{i}, ",")(1);
    T{i,1} = t1{i}(1:j - 1);
    T{i,2} = strtrim(t1{i}(j + 1:end));
end

Теперь
T{3,1} дает вам 3 и
T{3,2} дает вам Text with comma, more text.

0 голосов
/ 26 декабря 2011

После долгих часов поиска и отладки, вот как я заставил его работать в Octave 3.2.4.Использование | в качестве разделителя (вместо запятой).

Файл данных теперь выглядит следующим образом:

1|Some text
2|More text
3|Text with comma, more text

Вот как его назвать: data = load_data('data/data_file.csv', NUMBER_OF_LINES);

Ограничение: вам нужно знать, сколько строк вы хотите получить.Если вы хотите получить all , то вам нужно написать функцию для подсчета количества строк в файле, чтобы инициализировать cell_array.Это все очень неуклюже и примитивно.Так много для «языков высокого уровня, таких как Octave».

Примечание. После неприятного упражнения заставить это работать, кажется, что Octave не очень полезен, если вы не любите тратить свое время на написание кода для выполнения самых простых вещей,Лучше выбрать R, Python или C # / Java с библиотекой машинного обучения или матриц.

function all_messages = load_data(filename, NUMBER_OF_LINES)
  fid = fopen(filename, "r");

  all_messages = cell (NUMBER_OF_LINES, 2 );
  counter = 1;

  line = fgetl(fid);

  while line != -1
      separator_index = index(line, '|');
      all_messages {counter, 1} = substr(line, 1, separator_index - 1); % Up to the separator
      all_messages {counter, 2} = substr(line, separator_index + 1, length(line) - separator_index); % After the separator
      counter++;

      line = fgetl(fid);
  endwhile

  fprintf("Processed %i lines.\n", counter -1);
  fclose(fid);
end
...