是否可以循环textscan吗?

9的观点(30天)
赛义德贝罗
赛义德贝罗 2017年4月10日
编辑: dpb 2017年4月11日
我写的代码在这个表单,但不能读取数据遍历textscan。
我的deasire挑的头
数据是这样的:
CPNFC2006/01/01就是
fmin =[,]敌人= (——)h说= (——)foE2 = (- - -)
fmin =[,]敌人= (——)h说= (——)foE2 = (- - -)
CPNFC2006/01/01 00:15:00
fmin =[,]敌人= (——)h说= (——)foE2 = (- - -)
fmin =[,]敌人= (——)h说= (——)foE2 = (- - -)
%
fid = fopen(文件名);
disp(文件名)
格式=' % 5 s % 4 d / % 2 d / % 2 d % 2 d: % 2 d: % 2 d '
m = 1:4:6
[站,yyyy, mm, dd, hh,锰、ss) = textread(文件名,格式,m);
结束
2的评论
赛义德贝罗
赛义德贝罗 2017年4月10日
编辑:赛义德贝罗 2017年4月10日
Stephen Cobeldick感谢您的回应。我的目标是提取信息的附加文件。首先我想拿头eg.g。CPNFC 2006/01/01就是,CPNFC 2006/01/01 00:15:00为了提取日期和时间。以后工作选择的参数如h 'F =[246]每一段。原始数据。

登录置评。

答案(2)

dpb
dpb 2017年4月10日
“CPNC”字符串一致在整个文件?
如果是这样,读取整个文件作为cellstring数组就做 操作匹配字符定位所需的行。
另外,似乎有一个固定在每个部分的行数;使用计数跳过许多行第一次……
类似(注意空气代码…)
fmt = [% *年代”{“yyyy / MM / dd HH: MM: SS”}% D];%为datetime日期格式字符串变量
nH = 15;%我统计的记录头之间
fid = fopen (
d = textscan(支撑材,fmt, 1);%的第一个日期/时间
~ feof (fid)
d = [d; textscan (fid, fmt, 1“headerlines”nH);
结束
fid =文件关闭(fid);
通常不想“长出”一个动态数组,但是对于一次阅读一个相对较短的文件的开销不会太坏。如果这样做,将会持续,可以从事一些效率。
2的评论
dpb
dpb 2017年4月10日
编辑:dpb 2017年4月11日
有别的东西导致然后;这是一个完全有效的赋值语句。检查前终止线匹配的括号的,。报价,等等,等等,…
齿顶高
实际上,格式字符串是畸形的…
> > fmt = [% *年代% D % {yyyy / MM / dd} {HH: MM: ss} D % * ^ \ [n] '];
> >~ feof (fid)
d = [d; textscan (fid, fmt, 1“headerlines”16)];
结束
> >谁d
的名字大小字节属性
d192 x257952年细胞
> > d {1,}
ans =
2006/01/01
ans =
就是
> >
注意说这是空气代码;不测试。

登录置评。


Stephen23
Stephen23 2017年4月10日
编辑:Stephen23 2017年4月11日
这是一个循环的替代品。这个代码指定了 * 性格是换行符和调用 textscan 一次读取整个文件。这将是比使用循环和扩大在每个迭代数组。
选择= {“EndOfLine”,‘*’,“分隔符”,' = []',
“MultipleDelimsAsOne”,真的,“CollectOutput”,真正的};
fmt = repmat (' % s '1、1 + 15 * 8);
fid = fopen (“CPNFC20060101.txt”,“rt”);
C = textscan (fid, fmt,选择{:});
文件关闭(fid);
C = C {1};
D = regexp (C (: 1),“\ s +”,“分裂”);
D = vertcat (D {:});
C (: 1) = D (:, 4);
D = D (: 2:3);
两个输出数组 D ,其中包含日期和时间 C ,其中包含两个字段名和字段值。这样做的好处是,它很容易构建 种基本结构 包含所有的数据:
E = genvarname (C (1:2:120));
:E (2) = num2cell (regexprep (C(: 2:2:结束),{”——+ ',“\ s +”},{“- - -”,}),1);
S =结构(E {:});
这使得访问数据简单:
> > (2)。(genvarname (“h”Es”))
ans =
E
> > (12)。(genvarname (“敌人”))
ans =
283年詹
> > S(结束)。(genvarname (“M (3000) F2”))
ans =
115年
我测试了这个文件:
2的评论
Stephen23
Stephen23 2017年4月11日
@Saeed贝罗:我不清楚你要做什么。
细胞数组 D 包含两列:第一个日期字符串,第二个时间字符串。你没有与这些字符串解释你想做什么,也不知道你想 “提取” 他们。你甚至没有说你想要的输出。对我来说很难帮助你如果你不提供任何信息,你在做什么,和你想要的。
你想将日期/时间字符串转换为日期向量,串行日期数字,datetime对象,或完全不同的东西吗?

登录置评。

社区寻宝

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

开始狩猎!