将没有定界符的文本文件读入矢量 MATLAB
Reading a text file with no delimiter into a vector MATLAB
我有一个包含 200 行的文本文件,每行有 200 个值。该文件由整数组成,但它们没有被任何定界符分隔,甚至没有 space。这是一个例子,
1111111111111111111111111111111111111111122222222222222222222222222220000111
1111111111111111111111111111100000000003123333333333333333333333333333300002
0000000000022222222222222222222222222222222211111121212222222222222222111111
文件开头可能包含一些字符串,但我只想读取这些数字。我希望能够计算每个整数的出现次数。因此,我会将所有这些数字读入一个向量或矩阵,其中向量中的每个元素都是文件中的一个数字。因此,向量必须包含 200 * 200 个元素。然后,我将计算每个元素的出现。
我检查了textscan
等可用的文件读取方法,但我认为 textscan
这种格式 C = textscan(fid,'%d %d');
需要指定 %d 200 * 200 次,是这种情况,还是有一种方法可以使用 textscan
?
我也试过importdata
,但是当我尝试打印结果时,我没有得到数值。似乎它只读取了第一行,因为这一行200x1 double
。这是输出,
A =
data: [200x1 double]
textdata: {6x1 cell}
colheaders: {[1x107 char]}
请问可以用什么方法读取上述文件?
您使用 importdata 获得的数据仅导入双精度值和 headers。您可以按如下方式使用 readtable 函数(我假设有 1 header 行):
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')
这应该 return 一个 1x11 的单元格,其中包含 char-format 中的数字。
一个简单的方法:
每个整数都是一个单独的数字(在所需的输出中),因此逐行读取数据作为字符串,然后循环
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))
会更快更容易
我有一个包含 200 行的文本文件,每行有 200 个值。该文件由整数组成,但它们没有被任何定界符分隔,甚至没有 space。这是一个例子,
1111111111111111111111111111111111111111122222222222222222222222222220000111
1111111111111111111111111111100000000003123333333333333333333333333333300002
0000000000022222222222222222222222222222222211111121212222222222222222111111
文件开头可能包含一些字符串,但我只想读取这些数字。我希望能够计算每个整数的出现次数。因此,我会将所有这些数字读入一个向量或矩阵,其中向量中的每个元素都是文件中的一个数字。因此,向量必须包含 200 * 200 个元素。然后,我将计算每个元素的出现。
我检查了textscan
等可用的文件读取方法,但我认为 textscan
这种格式 C = textscan(fid,'%d %d');
需要指定 %d 200 * 200 次,是这种情况,还是有一种方法可以使用 textscan
?
我也试过importdata
,但是当我尝试打印结果时,我没有得到数值。似乎它只读取了第一行,因为这一行200x1 double
。这是输出,
A =
data: [200x1 double]
textdata: {6x1 cell}
colheaders: {[1x107 char]}
请问可以用什么方法读取上述文件?
您使用 importdata 获得的数据仅导入双精度值和 headers。您可以按如下方式使用 readtable 函数(我假设有 1 header 行):
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')
这应该 return 一个 1x11 的单元格,其中包含 char-format 中的数字。
一个简单的方法: 每个整数都是一个单独的数字(在所需的输出中),因此逐行读取数据作为字符串,然后循环
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))
会更快更容易