考虑以下文本(csv)文件:
1, Some text
2, More text
3, Text with comma, more text
如何在Octave中将数据加载到2D数组中?该数字可以进入第一列,第一个逗号右边的所有文本(包括其他逗号)都会进入第二个文本列。
如果有必要,我可以用不同的分隔符替换第一个逗号。
答案 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