一、 目的
工作中有时候感觉编程也是一种重复性劳动,尤其是涉及到读写数据一类的内容,还有一些需要进行配置的场合,有时候就想,既然是重复性的劳动,为什么不交给工具来做呢,这就产生了使用代码生成代码的想法。本文提到的实现文本内容批量替换是实现代码自动生成的一个步骤,实现了找到文本中指定的段落,并把该段落换成另外的内容。
二、 基本思想
实现文本内容批量替换可以大致分为以下几个步骤:
- 打开一个文本文件,读取到cell数组,srcCell
- 逐行读取srcCell数组并逐行抄到tmpCell,直到遇到要替换段落的起始行。
- 将要替换的目标内容desCell写到tmpCell.
- 继续逐行读取srcCell,直到读到要替换的段落的结束行。
- 继续逐行读取srcCell,把srcCell的剩余内容抄到tmpCell
- 将temCell写入到文件
至此完成文本替换。
三、 代码实现
编写matlab函数strReplace()如下:
function [outCell] = strReplace(srcCell,desCell,beginStr,endStr)
outPointer = 0;
srcCellSize = size(srcCell);
desCellSize = size(desCell);
endRowNum = strmatch(beginStr,srcCell);%起始替换内容位置
range = 1 : endRowNum;
for i = range
outPointer = outPointer + 1;
outCell{outPointer} = srcCell{i}; %先抄下来srcCell需要替换内容前的行
end
range = 1 : desCellSize;
for i = range
outPointer = outPointer + 1;
outCell{outPointer} = desCell{i}; %接着写要替换的行
end
beginRowNum = strmatch(endStr,srcCell); %替换内容结束位置
range = beginRowNum : srcCellSize;
for i = range
outPointer = outPointer + 1;
outCell{outPointer} = srcCell{i}; %接着抄下来剩余的行
end
outCell = outCell'
其中outPointer为标记当前处理到哪一行的指针。使用该函数时srcCell为读取源文件获取到的cell,desCell为替换的目标cell,beginStr为要替换的起始行,string类型,endStr为要替换的结束行,string类型。
四、 其他工作
strReplace()实现了上述2-5步,需要注意的是,该函数认为beginStr,endStr为标记行,会保留这两行的信息。
可以使用如下方法将文本文件读取到cell数组
filepath = 'x:\xx\xxx.x';
fileData = importdata(filepath);
使用fprintf将替换完成的cell数组写会文本
newcell = strReplace(fileData,dscCell,"//module input begin","//module input end");
fid = fopen(fpath,'wt');
for i = 1:size(newcell )
fprintf(fid,"%s\n",newcell {i});
end
fclose(fid);
五、 补充
编写该代码的目的是实现代码的自动生成,2017年的时候接触st公司的cube mx工具,该工具一改传统的stm32库函数编程方式,使用图形界面实现外设的初始化,大大提高的开发效率,令我印象深刻。
如今工作中遇到需要根据某些属性改变反复修改代码,就尝试实现一个简陋的代码生成工具,便有了上述脚本。有些场合需要根据配置反复修改代码,可以尝试把配置放到excel或者数据库,然后使用matlab完成代码段的格式化,然后用新的代码段覆盖旧的代码段,以提升开发效率。