一、问题描述:
做实验生成大量txt文件,放置在同一个文件夹内,要对文件内容中有用数据进行提取,提取到的数据放在excel文件中。
1.txt文件内容格式
2.提取内容
若语句存在“发往”,提取:时间戳 / 源节点 / 目标节点(如:2024/8/20 21:10:27 33 00)
若语句存在“广播到所有节点”和“ID”,提取:时间戳 / 源节点 / 目标节点 / 两个互换的节点(如:2024/8/20 21:11:02 00 所有 00 02)
3.主要函数
regexp():正则表达式函数,用于对字符串进行查找,对大小写敏感;参考
contains():判断字符串或元胞数组中是否有含有指定的内容; 参考
二、解决程序
% 文件路径设置
inputFile = 'data.txt'; % 输文件路径和文件名
outputFile = 'extracted_data6.xlsx'; % 输出Excel文件路径和文件名
% 打开文件进行读取
fid = fopen(inputFile, 'r', 'n', 'UTF-8');%确保UTF8,否则含中文contains出问题进不去条件句
if fid == -1
error('无法打开文件');
end
% 初始化存储时间戳和节点信息的cell数组
timestamps = {};
sourceNodes = {};
destinationNodes = {};
ID1_Nodes = {};
ID2_Nodes = {};
% 按行读取文件内容
line = fgetl(fid);
while ischar(line)
% 使用正则表达式提取时间戳
timeStamp = regexp(line, '\d{4}/\d{1,2}/\d{1,2} \d{1,2}:\d{2}:\d{2}', 'match', 'once');%每行开头YYYY/MM/DD CC:MM;SS
if ~isempty(timeStamp)
timestamps{end+1, 1} = timeStamp; % 保存时间戳
end
% 提取节点信息 ,这一部分按需修改即可
sourceNode = '';
destinationNode = '';
ID1_Node = '';
ID2_Node = '';
if contains(line, '发往')%如果这一行中包含”发往“
% 提取"发往"的信息
tokens = regexp(line, '从(\d{2})节点发往(\d{2})节点', 'tokens', 'once');
if ~isempty(tokens)
sourceNode = tokens{1}; % 从节点
destinationNode = tokens{2}; % 发往节点
end
elseif contains(line, '广播到所有节点')%如果这一行中包含'广播到所有节点'
% 提取"广播到所有节点"的信息
tokens = regexp(line, '从(\d{2})节点广播到所有节点', 'tokens', 'once');
if ~isempty(tokens)
sourceNode = tokens{1}; % 从节点
destinationNode = '所有'; % 目标节点为“所有”
end
if contains(line, 'ID')%如果这一行中包含”ID“
% 提取"ID"的信息
tokens2 = regexp(line, '当前网络(\d{2})节点和(\d{2})节点ID互换', 'tokens', 'once');
if ~isempty(tokens2)
ID1_Node = tokens2{1}; % 从节点
ID2_Node = tokens2{2}; % 发往节点
end
end
else
disp('字符串中不包含子串"发往"')
end
% 保存提取到的节点信息
sourceNodes{end+1, 1} = sourceNode;
destinationNodes{end+1, 1} = destinationNode;
ID1_Nodes{end+1, 1} = ID1_Node;
ID2_Nodes{end+1, 1} = ID2_Node;
% 读取下一行
line = fgetl(fid);
end
% 关闭文件
fclose(fid);
% 将提取的数据合并为一个表格
dataTable = table(timestamps, sourceNodes, destinationNodes,ID1_Nodes,ID2_Nodes, ...
'VariableNames', {'Timestamp', 'Source_Node', 'Destination_Node','ID1_Nodes','ID2_Nodes'});
% 将表格写入Excel文件
writetable(dataTable, outputFile);
disp(['数据已提取并保存到 ' outputFile]);
联系作者:2230648022@qq.com