当我们需要处理的txt数据非常复杂,每一行的数据没有任何规律的时候,需要我们手动写程序抽取数据,有时候甚至需要用到字符串匹配的正则表达式。
但是如果我们的txt数据每一行的数据类型是一样的,而且每一行的数据个数和分割符号都是一样的,这时候就可以直接使用matlab提供的一键导入数据方法,而且matlab还能针对我们的数据生成定制化的函数,当下次再导入同一种txt数据的时候直接调用上一次生成的函数就行了。
帖子讲述一种不编程导入外部txt文件的方法,而且matlab自动生成函数,方便后续重复导入相同类型的人数据。
针对规律的txt文件,matlab提供了一键导入功能,如下图框框中的部分 这里以读取abaqus生成的C3D8单元的信息为例。我首先将模型的节点坐标拷贝到了外部的txt文件中,如下图 节点坐标信息每一行四个数据,数据之间用英文的逗号分割。是一种规律的数据,可以使用matlab的“导入数据”功能,点击这个功能按钮,选择我们的txt文件并打开,打开后的默认选择为 上图中矩形框中的选项就是需要调整的,其中最重要的有:分割文件、等宽、输出类型,导入所选内容。下面挨个讲解。
首先是分割文件和等宽,当我们打开数据时,默认是等宽,即matlab按照等宽度来分割识别txt中的数据,但是我们的节点坐标信息不符合等宽数据,那就调整到分割文件,以逗号形式,如下图所示 需要注意的是,我们的节点坐标信息是以逗号分割的,事实上分割文件的方式有很多种,如下图所示 如上图,matlab给我们提供了很多种选择,如:Tab键、逗号、空格和分号,甚至下面还有自定义分隔符,可以说matlab给我们导入数据提供了非常高的自由度。
下面再来调整输出类型,这个功能的位置如下图 这里选择的是数值矩阵,可以看到matlab同样提供了很多种输出类型,还有:表、列向量、元胞数组和字符串数组。
然后就是具体的导入选项了,同样有很多种导出的选择,如下图 这里提供了四种导入选项,其中,导入数据是直接将数据导入到内存中,生成函数是matlab针对目前的txt文件数据生成特定的函数,方便后来直接调用,至于生成实时脚本和生成脚本,用的不是很多,就不多说了。
这里首先展示直接导入数据后的效果,如下图所示,节点坐标信息直接导入到了matlab的内存中 如果我们选择了生成函数,matlab则会直接给出一个函数,我们可以直接复 制,今后再导入节点坐标信息的时候直接调用即可,如下图所示 全部的matlab程序为
function node = importfile(filename, dataLines)
%IMPORTFILE 从文本文件中导入数据
% NODE = IMPORTFILE(FILENAME)读取文本文件 FILENAME 中默认选定范围的数据。 返回数值数据。
%
% NODE = IMPORTFILE(FILE, DATALINES)按指定行间隔读取文本文件 FILENAME
% 中的数据。对于不连续的行间隔,请将 DATALINES 指定为正整数标量或 N×2 正整数标量数组。
%
% 示例:
% node = importfile("C:\Users\nnn\Desktop\FEM\info\C3D8\node.txt", [1, Inf]);
%
% 另请参阅 READTABLE。
%
% 由 MATLAB 于 2024-12-21 20:11:09 自动生成
%% 输入处理
% 如果不指定 dataLines,请定义默认范围
if nargin < 2
dataLines = [1, Inf];
end
%% 设置导入选项并导入数据
opts = delimitedTextImportOptions("NumVariables", 4);
% 指定范围和分隔符
opts.DataLines = dataLines;
opts.Delimiter = ",";
% 指定列名称和类型
opts.VariableNames = ["VarName1", "VarName2", "VarName3", "VarName4"];
opts.VariableTypes = ["double", "double", "double", "double"];
% 指定文件级属性
opts.ExtraColumnsRule = "ignore";
opts.EmptyLineRule = "read";
% 导入数据
node = readtable(filename, opts);
%% 转换为输出类型
node = table2array(node);
end
下面我再读取C3D8单元的单元节点信息,六面体单元的节点信息如下图 每一行有九个数据,数据之间用逗号分割,是有规律的数据,可以用matlab的导入数据功能。将节点以导入数据的形式导入到内存后,在matlab中显示为 如果以生成函数的形式导入数据,则如下图所示 全部的代码为
function element = importfile(filename, dataLines)
%IMPORTFILE 从文本文件中导入数据
% ELEMENT = IMPORTFILE(FILENAME)读取文本文件 FILENAME 中默认选定范围的数据。 返回数值数据。
%
% ELEMENT = IMPORTFILE(FILE, DATALINES)按指定行间隔读取文本文件 FILENAME
% 中的数据。对于不连续的行间隔,请将 DATALINES 指定为正整数标量或 N×2 正整数标量数组。
%
% 示例:
% element = importfile("C:\Users\nnn\Desktop\FEM\info\C3D8\element.txt", [1, Inf]);
%
% 另请参阅 READTABLE。
%
% 由 MATLAB 于 2024-12-21 20:33:49 自动生成
%% 输入处理
% 如果不指定 dataLines,请定义默认范围
if nargin < 2
dataLines = [1, Inf];
end
%% 设置导入选项并导入数据
opts = delimitedTextImportOptions("NumVariables", 9);
% 指定范围和分隔符
opts.DataLines = dataLines;
opts.Delimiter = ",";
% 指定列名称和类型
opts.VariableNames = ["VarName1", "VarName2", "VarName3", "VarName4", "VarName5", "VarName6", "VarName7", "VarName8", "VarName9"];
opts.VariableTypes = ["double", "double", "double", "double", "double", "double", "double", "double", "double"];
% 指定文件级属性
opts.ExtraColumnsRule = "ignore";
opts.EmptyLineRule = "read";
% 导入数据
element = readtable(filename, opts);
%% 转换为输出类型
element = table2array(element);
end
是不是还挺方便的!
但是任何方法都都有它自己的适用范围,这种方式只能适用那些规则的数据,即每一行的数据个数相同,数据之间的分隔符号相同。如果是复杂的字符文本文件,那就非得用matlab的正则表达式进行字符操作了。