我有一个文本文件,其中包含用逗号和空格分隔的数字。它实际上是一个文件,每行包含行和数字对的索引,这样这些对用空格分隔,每对的数字用逗号分隔。每行中的列数不同。 例如,文件的两行如下:
1 34,10 12,23
2 22,123 11,102 12,34 22,232
我尝试了dlmread
,但由于文件中有逗号,因此会出错。我试过了csvread
,但它只读取了一些数据并且模式不清楚。我也用过:
mymatrix = load('filename.txt','-ascii')
但它会出错,因为每行的列数不相同。
如何阅读这种不规则数据模式?
答案 0 :(得分:0)
importdata
GUI是一个非常强大的工具:
我几乎从未遇到过无法使用的情况。有时它太过分了,因为文件的结构更加规则,应该使用其他功能。但是在你的情况下,不同的行长度是一个不错的选择。
好处是,它很直观:输入文件,更改一些参数,最后自动生成脚本(“导入选择按钮”):
你得到一个漂亮的双矩阵:
data =
1 34 10 12 23 NaN NaN NaN NaN
2 22 123 11 102 12 34 22 232
如果您有多个文件,每行的最大值对数不同,您可以使用发生总体最大数量的文件,也可以使用生成的脚本并对其进行修改以进行动态检测。但首先要看,如果这对你来说已经足够好了。
这是GUI生成的代码:
filename = 'data.txt';
formatSpec = '%f%f%f%f%f%f%f%f%f%[^\n\r]';
fileID = fopen(filename,'r');
data = textscan(fileID, formatSpec, 'Delimiter', {',',' '}, ...
'MultipleDelimsAsOne', true, 'EmptyValue' ,NaN, 'ReturnOnError', false);
out = [data{1:end-1}];
答案 1 :(得分:0)
考虑到您事先不知道输入文件中的最大数据数的一般情况,您可以使用fgetl
逐行读取文件。
fgetl
返回char
字符串,然后您可以使用array
str2num
个数字
由于每个数组的长度可能不同,因此您可以将数组分配给cellarray
以收集所有数据。
% Open input file
fid=fopen('tmp_in.txt');
% Initialize output
the_data=[];
% Read the input file
while 1
tline = fgetl(fid);
if(~ischar(tline))
break
end
% Convert to number and store in a cellarray
the_data=cat(1,the_data,{str2num(tline)})
end
% Close the input file
fclose(fid);
希望这有帮助。
答案 2 :(得分:0)
由于行长度不规则,我不相信有一个简单的解决方案。但这是一个应该有效的战略。
fgetl
会奏效。 nPair = length(strfind(myLine, ','));
formatSpec = ['%d', repmat(' %d,%d', [nPair, 1])]
rowNums = textscan(myLine, formatSpec);
rowNums
现在将该行的编号作为单元格数组。