MATLAB处理txt文档数据——以处理pscad输出数据为例

pscad数据输出设置方法

首先介绍一下pscad的数据输出。
我用的是pscad4.5,直接在最上方【Project】菜单中,勾选【Save channel to disk】,软件会提供默认输出文件名,也可以自己命名。
数据输出设置当然也可以在【General Settings】里面设置,如下图所示。
设置方法2

pscad数据输出路径

在你当前project所在的路径下的一个xxx.if12文件夹里(此处xxx为你要输出数据的case文件名,后缀.if12可能未必相同,但只要根据case文件名就可以唯一定位文件夹了,所以不用纠结)。
在这里插入图片描述比如我整个workspace(其中就一个project)在桌面DFIG文件夹中,要输出数据的是“DFIG_3in1”case,那么对应的输出文件就在上图圈出的文件夹中。

两类文件

单纯的一串数字其实是没有任何意义的,还必须知道数据对应的是哪个通道、数据的含义、维度、单位等(可以将这些称之为数据的信息)。所以pscad进行数据输出会一次性输出两类文件:数据文件+信息文件。

数据文件

后缀为.out,画风如下图所示。
在这里插入图片描述基本上就是一堆数字,给你你也完全摸不着头脑。但还是要说明一下:每个数据文件都是x行11列。第一列是时间信息,后续每一列就是一个通道的数据;具体有多少行和仿真总时长以及采样步长有关。
当输出的通道数超过10,pscad会自动生成多个数据文件,如下图所示。
在这里插入图片描述
接下来就要知道每一列分别具体对应哪个通道,以及数据的单位等信息。这时信息文件的作用就体现出来了。

信息文件

后缀为.infx,画风如下图所示。
在这里插入图片描述可用信息:【索引值index】【变量名name】【维度dim】【单位unit】,这也是我们后续数据处理需要提取出来的信息。

MATLAB处理

首先我是直接将待处理数据文件和信息文件统一放到m文件同路径下,理论上应该是可以设置文件路径然后去该路径下读取的,但此处先不考虑。

信息文件处理

此处参考了另一篇博文:

https://blog.csdn.net/qq_36976807/article/details/105439321

代码如下:

fid = fopen('DFIG_2011_03.infx');  %先打开文件,输入形参为对应文件名
c1=textscan(fid,'%*s%s%*s%*s%*s%s%*s%*s%*s%n%*s%s%*[^\n]','delimiter','"','headerlines',6);
%使用的函数为textscan函数
%形参1为fopen函数的返回值
%形参2为读取文件的格式,也是最关键的部分,会在下文单独介绍
%形参34为设置分隔符,我认为这是关键部分之二
%形参56为设置跳过文件前x行,headerlines这里设置6可以跳过前面6fclose(fid);
sequence=c1{1};
name=c1{2};
dim=c1{3};
unit=c1{4};

首先说一下delimiter参数。该参数实际上就是设定如何去划分一堆数据:给了一堆数据,哪个是数据1,哪个是数据2。通常都是以空格分隔,这实际上也是MATLAB默认的分隔符。比如下面的一行数据,以空格分隔就是7个数据;以双引号划分就是5个数据。

1 2 "str1" "str2" 3 4 5

由于infx文件的关键信息都夹在在双引号中间,所以我们以双引号为delimiter

下面介绍形参2。参考了mathworks的官方教程:

https://www.mathworks.com/help/matlab/ref/textscan.html

'%*s%s%*s%*s%*s%s%*s%*s%*s%n%*s%s%*[^\n]'
1%s表示读取一个字符串
2%*s表示跳过一个字符串(*表示跳过)
3%n表示读取一个double
4%*[^\n]表示skipping the rest of the line,即跳过该行剩余部分,因为后面的数据我们并不需要。
5、所以实际上这一串格式字符的书写是需要我们照着infx文件挨个儿数过来:
哪个数据是我们需要的,就用百分号加上对应的格式控制符;
不需要的就用*跳过(百分号和格式控制符还是要加上的)。
必要时用%*[^\n]跳过剩余部分。

具体输出效果不详述,相信大家实际运行一遍就明白。

数据文件处理

我是先把所有数据先读取到MATLAB中,然后根据自己的需要去取用对应的数据。主要分为以下几步:

确定读取格式

因为最后一个数据文件可能并不是恰好11列,所以 textscan 函数控制读取格式的形参会有所不同,具体代码如下:

%确定读取格式
fileNum=8;
format=string(zeros(1,fileNum));
for i=1:fileNum
    format(i)="";
end
col2=mod(length(seq),10)+1;%最后一个数据文件的列数

for i=1:fileNum
    if i==fileNum
        for j=1:col2
            format(i)=format(i)+"%f64";
        end
        format(i)=format(i)+"%*[^\n]";%如果是只读前面几列,一定要用%*[^\n]来跳过后面不读的列,不然matlab会把后面也读进来,就串了。
    else
        for j=1:11
            format(i)=format(i)+"%f64";
        end
    end
end

要注意的是:如果是只读前面几列,一定要用%*[^\n]来跳过后面不读的列,不然matlab会把后面也读进来,就串了。 这在注释中也有说明。

生成数据文件名

主要是为了做到全自动化,避免手动输入,代码如下:

%文件名
filename=string(zeros(1,fileNum));
for i=1:fileNum
    filename(i)="DFIG_0"+i+".out";
end
  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值