从ASCII文件将文本值读入matlab变量

从ASCII文件将文本值读入matlab变量,matlab,text,file-io,text-files,text-processing,Matlab,Text,File Io,Text Files,Text Processing,考虑以下文件 var1 var2 variable3 1 2 3 11 22 33 我想将数字加载到矩阵中,将列标题加载到一个变量中,该变量相当于: variable_names = char('var1', 'var2', 'variable3'); 我不介意将名称和数字分成两个文件,但是准备matlab代码文件并评估它们不是一个选项 请注意,可以有任意数量的变量(列)只需使用具有不同格式说明符的文本扫描即可 fid = fopen(filename,'r'); h

考虑以下文件

var1 var2 variable3
1     2    3
11    22   33
我想将数字加载到矩阵中,将列标题加载到一个变量中,该变量相当于:

variable_names = char('var1', 'var2', 'variable3');
我不介意将名称和数字分成两个文件,但是准备matlab代码文件并评估它们不是一个选项


请注意,可以有任意数量的变量(列)

只需使用具有不同格式说明符的文本扫描即可

fid = fopen(filename,'r');
heading = textscan(fid,'%s %s %s',1);
fgetl(fid); %advance the file pointer one line
data = textscan(fid,'%n %n %n');%read the rest of the data
fclose(fid);

在本例中,“heading”将是一个单元格数组,其中包含每个列标题的单元格,因此您必须将它们更改为字符串单元格数组或任何您想要的内容“数据”将是一个单元格数组,包含您读取的每一列的数字数组,因此您必须将它们组合在一起以形成一个矩阵。

如果标题位于第一行,则

A = dlmread(filename,delimString,2,1);
将数字数据读入矩阵A

然后您可以使用

fid = fopen(filename)
headerString = fscanf(fid,'%s/n') % reads header data into a string
fclose(fid)
然后可以使用strtok将headerString拆分为一个单元格数组。这是我能想到的一种处理未知数量列的方法

编辑
修复了fscanf函数调用

我建议对此类操作导入数据:

d = importdata('filename.txt');
返回是一个结构,在名为“data”的成员中包含数字字段,在名为“colheaders”的字段中包含列标题


另一个用于导入和处理此类数据的有用接口是统计工具箱中可用的“dataset”类。

可能有任意数量的变量(列),如果您事先不知道列数,则必须一次读取一行文件。如果您使用单个%s调用textscan,并且没有限制号码,它将从该行读取N个字符串。我认为这比使用strtok更好/更快。