如何读取变量从多个”。选项卡的文件?

11视图(30天)
特斯”class=
特斯 2017年7月18日
评论道: 圆睁温2021年6月18日
(“我有序列的数据文件。选项卡的文件)每11900行和236列。我必须从每个文件读取的一些变量。我打开一些文件的文件夹。但是我不能读取变量。南和数值变量列。只有NaN值而不是数值显示。
清晰的所有;
clc;
文件= dir (fullfile (“C: \ \用户文档\ 2015 \ 02 \ * .tab '));
i = 1:2
fid (i) = fopen(文件(我). name);
文件(我). values = textscan (fid(我),' % s ',“分隔符”,,“HeaderLines”,296,“MultipleDelimsAsOne”1);
formatSpec =' % 19 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % 16 s % s % ^ \ n \ [r];
dataArray = textscan(文件(i) . name、formatSpec“分隔符”,,“空格”,,“ReturnOnError”、假);
生= repmat ({},长度(dataArray{1}),长度(dataArray) 1);
k = 1:11900; l = 1:236;
生(k, l) =生(长度(dataArray{1}),长度(dataArray) 1);
n (k, l) = str2double(生(:,2));
h (k, l) = str2double(生(:,197));
结束
fclose (“所有”);
结束
我怎么能读取多个文件和文件中的变量在MATLAB ?我附加的文件。
3评论
特斯”class=
特斯 2017年7月18日
我试图使用导入工具读取数据。但整个数据阅读作为单一变量包括headerlines单一细胞而不是236年。

登录置评。

答案(2)

Stephen23”class=
Stephen23 2017年7月18日
编辑:Stephen23 2019年10月24日
这段代码自动定位的标题行通过检查 # 字符开始的时候,变量 mywant 指定你想从矩阵的列:所有其他数字列完全被忽视和不读到MATLAB内存。代码也忽视了所有字符串列,虽然可以轻松地扩展代码导入它们。
的变量 mywant 让你请求任何数值列/ s(如。 残雪 , cY 从最低等)通过输入一行最多6行数据头(从顶部开始,即第一行,row2,等等):
mywant = {{cXrow1text cXrow2text,},{cYrow1text, cYrow2text,…},…}
如果你要在一个循环中调用这个我强烈建议你把这段代码放到一个函数,调用该函数的循环。
mywant = {{“电子”,“密度”,},{“宇宙飞船”,“高度”,“Aeroid”}};
mypath =;
的名字=“mvn_kp_insitu_20150202_v10_r01.tab”;
%的名字=“mvn_kp_insitu_20150512_v15_r01.tab”;
myfull = fullfile (mypath,名字);
%
(fid,味精)= fopen (myfull,“rt”);
断言(fid > = 3,味精);
%
%读行直到去年“#”:
vec =南(1,8);
str =“#”;
~ feof (fid) & & strncmp (str,“#”,1)
vec([2:最终,1])=矢量;
vec (1) = ftell (fid);
str = fgetl (fid);
结束
fseek (fid, vec(结束),“转炉”);
str = fgetl (fid);
soh = ftell (fid);%的头
vec = regexp (str,“\ d +”,“结束”);
num =元素个数(vec);%的列数
vec = diff (vec) [0,);%列宽
%
%读标题行:
fmt = sprintf (% % %直流的、vec);%列固定宽度
hdr = textscan (fid, fmt 6“空格”,);
hdr = cellfun (@cellstr hdr,“大学”,0);
hdr = cellfun (@strtrim hdr,“大学”,0);
%
%定位请求的标题:
任何(cellfun有趣= @ (h) (@ (w)所有(strcmp (w (:), h(1:元素个数(w)))), mywant));
idx = cellfun(有趣,hdr);
%确定任何字符串列:
选择= {“MultipleDelimsAsOne”,真的,“CollectOutput”,真的,“HeaderLines”6};
fmt = repmat (' % s '1、num);
fseek (soh支撑材,“转炉”);
dat = textscan (fid, fmt 1选择{:});
dat = dat {1};
id = isnan (str2double (dat)) & ~ strcmpi (“南”dat);
%
%生成格式字符串:
fmt = repmat ({' % * f '}1 num);
fmt (idx) = {' % f '};%要求列
fmt (ids) = {% *年代”};%字符串列都忽略,但这可能是改变了……
fmt = horzcat (fmt {:});
%读取请求数据:
fseek (soh支撑材,“转炉”);
dat = textscan (fid, fmt,选择{:});
dat = dat {1};
%
文件关闭(fid);
它产生该输出:
> >大小(dat)
ans =
4359 2
> > dat
dat =
南222.850
196.000 - 224.600
186.000 - 226.370
170.000 - 228.170
142.000 - 229.990
99.300 - 231.830
58.100 - 233.700
102.000 - 235.580
103.000 - 237.490
162.000 - 239.420
101.000 - 241.380
148.000 - 243.350
185.000 - 245.350
151.000 - 247.370
178.000 - 249.420
118.000 - 251.480
128.000 - 253.570
145.000 - 255.670
156.000 - 257.800
166.000 - 259.950
171.000 - 262.130
173.000 - 264.320
148.000 - 266.540
166.000 - 268.780
171.000 - 271.030
190.000 - 273.310
134.000 - 275.610
162.000 - 277.940
105.000 - 280.280
113.000 - 282.640
109.000 - 285.030
5个评论
圆睁温”class=
圆睁温 2021年6月18日
谢谢你的回复,我将试试!

登录置评。


1月”class=
1月 2017年7月18日
注:不需要 fullfile 如果你只有一个参数。存储在一个矢量文件标识 fid(我) nopt有用,如果你关闭 所有 文件由 文件关闭(所有的) 在每个itereation。更好地利用 fid = fopen (…) fclose (fid)
fid (i) = fopen(文件(我). name) 不考虑的文件夹。好:
fid (i) = fopen (fullfile(文件(我)。文件夹、文件(我). name))
你在首先导入文件 textscan (fid(我)) 然后再一次 textscan(文件(i) . name) 。你为什么这样做?我希望这个失败。
我不理解的目的
生(k, l) =生(长度(dataArray{1}),长度(dataArray) 1);
n (k, l) = str2double(生(:,2));
h (k, l) = str2double(生(:,197));
这三个任务访问相同的元素 在每个迭代中。表达式不依赖于k,所以循环是浪费时间。只要是不清楚你想实现,建议修改只能是基于猜测。
最后输出原材料,n, h是覆盖的迭代 因为我 循环。
1评论
特斯”class=
特斯 2017年7月18日
有30个文件的文件夹。将代码阅读第二和每个文件的第197列?

登录置评。

类别

找到更多的在数据导入与分析帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!