从文本文件

时间:2015-08-15 07:17:08

标签: matlab file-io

我有一个文本文件,其中包含用逗号和空格分隔的数字。它实际上是一个文件,每行包含行和数字对的索引,这样这些对用空格分隔,每对的数字用逗号分隔。每行中的列数不同。 例如,文件的两行如下:

1 34,10 12,23
2 22,123 11,102 12,34 22,232

我尝试了dlmread,但由于文件中有逗号,因此会出错。我试过了csvread,但它只读取了一些数据并且模式不清楚。我也用过:

mymatrix = load('filename.txt','-ascii')

但它会出错,因为每行的列数不相同。

如何阅读这种不规则数据模式?

3 个答案:

答案 0 :(得分:0)

importdata GUI是一个非常强大的工具:

enter image description here

我几乎从未遇到过无法使用的情况。有时它太过分了,因为文件的结构更加规则,应该使用其他功能。但是在你的情况下,不同的行长度是一个不错的选择。

好处是,它很直观:输入文件,更改一些参数,最后自动生成脚本(“导入选择按钮”):

enter image description here

你得到一个漂亮的双矩阵:

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)

由于行长度不规则,我不相信有一个简单的解决方案。但这是一个应该有效的战略。

  1. 迭代文件中的每一行。 fgetl会奏效。
  2. 对于每一行,        做nPair = length(strfind(myLine, ','));
  3. formatSpec = ['%d', repmat(' %d,%d', [nPair, 1])]
  4. rowNums = textscan(myLine, formatSpec);

  5. rowNums现在将该行的编号作为单元格数组。

  6. 祝你好运!