MATLAB对txt文件内容提取(文件含中文),使用正则表达式regexp()提取时间戳和数据及contains()函数判断语句是否包含指定内容

一、问题描述:

做实验生成大量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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值