【问题标题】:Reading a text file with no delimiter into a vector MATLAB将没有分隔符的文本文件读入向量 MATLAB
【发布时间】:2015-08-18 00:16:27
【问题描述】:

我有一个包含 200 行的文本文件,每行有 200 个值。该文件由整数组成,但它们没有被任何分隔符分隔,甚至没有空格。这是一个例子,

1111111111111111111111111111111111111111122222222222222222222222222220000111
1111111111111111111111111111100000000003123333333333333333333333333333300002
0000000000022222222222222222222222222222222211111121212222222222222222111111

文件开头可能包含一些字符串,但我只想读取这些数字。我希望能够计算每个整数的出现次数。因此,我会将所有这些数字读入一个向量或矩阵,其中向量中的每个元素都是文件中的一个数字。因此,向量必须包含 200 * 200 个元素。然后,我将计算每个元素的出现次数。

我检查了textscan等可用的文件读取方法,但我认为textscan这种格式C = textscan(fid,'%d %d');需要指定%d 200 * 200次,是这样吗,还是有办法使用@987654325 @?

我也试过importdata,但是当我尝试打印结果时,我没有得到数值。由于这一行200x1 double,它似乎只读取了第一行。这是输出,

A = 
          data: [200x1 double]
      textdata: {6x1 cell}
    colheaders: {[1x107 char]}

您能告诉我可以使用什么方法来读取上述文件吗?

【问题讨论】:

  • 所以每个整数都是一个单独的数字?为什么不作为字符串读入,然后循环 for j= 1:numel(a_line_of_integers), x(j) = str2num(a_line_of_integers(j); end 。对你读入的每一行重复一遍。顺便指出,如果你切换到Rx=as.numeric(strsplit(a_line_of_Integers)) 会更快更容易
  • 没错,我只是想实现它。非常感谢您的帮助。
  • 如果您愿意,请将我的 cmets 复制到答案中。
  • @CarlWitthoft 如果我发布它,它看起来是我的答案,但它是你的。我强烈建议您将其发布为答案。很有帮助。
  • 好的,...只是想“捐赠”您可以获得的积分:-)

标签: matlab matrix vector integer


【解决方案1】:

您使用 importdata 拥有的数据仅导入双精度值和标题。您可以按如下方式使用 readtable 函数(我假设有 1 个标题行):

datafile='test.txt';
headerlines=1;

%OPTION1
A=readtable(datafile); %from Matlab R2013b
AA=cell2mat(table2array(A(headerlines+1:end,:)));

%OPTION2
A=textread(datafile,'%s'); %from Matlab R2006a
AA=cell2mat(A(headerlines+1:end,:));

%PROCESSING
b=zeros(size(AA));
for k=1:size(AA,1)
  b(k,:)=str2double(regexp(AA(k,:),'\d','match'));
end

%COUNTING
[nelements,centers]=hist(b',0:9);

正则表达式可以将数字输出到列中:

regexp('01112345640','\d','match')

这应该返回一个 1x11 的单元格,其中包含 char 格式的数字。

【讨论】:

  • 谢谢,这里出现语法错误,b(k,:)=regexp(a.data(k),'\d','match');表示“double”类型的输入参数的未定义函数“regexp”。我该如何解决?
  • 我找到了正则表达式。看来我只输入了正则表达式。但我仍然收到此错误,“char”类型的输入参数的未定义函数“readtable”。能告诉我怎么解决吗?
  • 您使用的是哪个 Matlab 版本? readtable 仅适用于 Matlab R2013b 和更高版本(在命令窗口中键入“版本”以了解您正在使用的版本)。在 datafile 中是您正在使用的文件的名称,而不是文件 ID!
  • 我有 2012 版。是的,我用它作为文件名。
  • 我更新了 2012 版的代码并添加了计数本身。这能解决你的问题吗?
【解决方案2】:

一个简单的方法: 每个整数都是一个单独的数字(在所需的输出中),因此以字符串形式逐行读取数据,然后执行循环

for j= 1:numel(a_line_of_integers), 
    x(j) = str2num(a_line_of_integers(j);
end 

对你读入的每一行重复一遍。顺便注意,如果你切换到 R,x=as.numeric(strsplit(a_line_of_Integers)) 会更快更容易

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多