2020-07-07-Matlab学习纪要——基于多文件名识别谈多字符串矩阵的索引

最近,需要对大量的仿真文件集中处理,刚写了一篇如何利用python批量处理txt文件转换为csv文件。

可以去这里看到这篇文章

Python学习纪要——把txt文件批量转换成csv

但如果每一个csv文件均单独写个语句导入matlab则太繁琐了,而且要分别对每一个导入的文件命名,若命名太繁琐则调用很麻烦,若太简单则描述不清楚具体仿真参数是怎样设置的。

针对这种情况,在导出仿真文件时就将文件名设置好,用语句批量导入Matlab,文件名作为结构体中的子类(即该文件的标签)则很好的解决这个问题,标签的传递也会很方便,可以将过程变量均打上这个标签就会很方便。

所以我写了一个批量读取CSV文件的子函数。

function [All,len,lable] = ReadAllCsv(address)

    add = strcat(address,'\*csv');

    files= dir(add);   % 这个是文件存放的绝对路径
    len = length(files);  % 获取当前文件的长度
%    M = 60; %设定数据文件名称最大值,对字符串进行补全,因为将多个不同长度的一维数组存入二维数组时,需要将所有一维数组的长度转为相同长度,可以采用在数组后边补零的方式实现。
    for i = 1: len     % 开始循环
        lable(i,:) = string(files(i).name(1:end-4));
        str = strcat ('E:\OneDrive - zju.edu.cn\Simulation Models\2. PSCAD46\5. 为Tensorflow出仿真数据\仿真数据\',files(i).name);
%       str_var(i,:) = strcat('All_',lable(i,:));
        var = readmatrix(str);
%         name = strip(lable(i,:));
        All.(lable(i,:)) = var;
    end
end

通过读取所在路径中所有带csv的文件名称,注意读取的文件名是带.csv的。然后按照文件数进行循环,将每一个文件的名称写入lable中。

这时候出现了一个bug。

最初的语句是写成。

lable(i,:) = files(i).name(1:end-4);

然后第二个循环时,由于文件名大小不同,出现错误提示说左边是$127$,右边是$129$,这样无法赋值。

原因在于字符串数组中,赋值进去的每一行的长度必须是相等的。这时候想到一个命令pad,可以在短字符串后面加上空格符,使之全部相等。

M = 60; %设定数据文件名称最大值,对字符串进行补全,因为将多个不同长度的一维数组存入二维数组时,需要将所有一维数组的长度转为相同长度,可以采用在数组后边补零的方式实现。
lable(i,:) = pad(files(i).name(1:end-4),M);

用这种方式确实可以不报错了,但在主函数中对字符串进行引用时,却无法引用空格,导致这样的数组不可用。想用strip命令将空格符删去,但做不到,这个原因还没研究清楚。

研究后发现,之所以数据长度不等无法赋值的原因在于,直接赋值后会将字符串中的每一个字符作为一列,导致整体字符串数组列数的不一致,可以将所有字符转换为字符串直接赋值,那么被赋值数据就只有一列,就不会发生赋值失败的问题,同时由于并没有对字符串进行更改,主函数中引用也没有问题。这样就产生了上面的批量读取csv文件的子函数。

子函数会返回所有csv文件数据,文件总数以及每个文件对应的标签即文件名。

所有文件数据

标签数据