如何将2D数组从文本(csv)文件加载到Octave?

时间:2011-12-15 01:02:44

标签: file-io csv octave text-files

考虑以下文本(csv)文件:

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

如何在Octave中将数据加载到2D数组中?该数字可以进入第一列,第一个逗号右边的所有文本(包括其他逗号)都会进入第二个文本列。

如果有必要,我可以用不同的分隔符替换第一个逗号。

2 个答案:

答案 0 :(得分:1)

AFAIK你不能把不同大小的蜇成阵列。您需要创建一个所谓的cell array

将存储在文件 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

答案 1 :(得分:0)

经过长时间的搜索和调试,以下是我如何使用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