Matlab 数据处理应用

背景:SENT解析工具保存的数据量很多,手动一个个处理比较费时间,直接用Excel打开.csv文件也容易出现格式问题,另外Excel绘制曲线功能存在一些不便和限制

第一版,先进行简单测试

function transform_csv_to_excel(input_file, output_file)
    % 读取 CSV 文件
    data = readtable(input_file, 'Delimiter', ',', 'ReadVariableNames', false);

    % 创建空单元格数组用于保存结果
    result = cell(height(data) + 1, 4);  % 增加1行用于标题
    result(1, :) = {'A', 'FC', 'C', 'SC'};  % 设置标题行

    % 遍历每一行数据
    for i = 1:height(data)
        frame_type = data{i, 3}{1};
        frame_data = data{i, 5}{1};
        timestamp = data{i, 11};

        if strcmp(frame_type, '快速通道帧')
            result{i + 1, 1} = frame_data;
            result{i + 1, 2} = timestamp;
        elseif strcmp(frame_type, '增强串行帧')
            result{i + 1, 3} = frame_data;
            result{i + 1, 4} = timestamp;
        end
    end

    % 将结果保存为 Excel 文件
    result_table = cell2table(result(2:end, :), 'VariableNames', result(1, :));
    writetable(result_table, output_file, 'WriteVariableNames', true);
end

将脚本保存为 transform_csv_to_excel.m

命令行操作,设置导入导出,调用脚本

input_file = 'C:\Users\Leon\Desktop\SKT-2385测试\JJW\ZY2.csv';
output_file = 'C:\Users\Leon\Desktop\SKT-2385测试\JJW\output8.xlsx';
transform_csv_to_excel(input_file, output_file);

原始数据导出最终版

先不处理数据

function transform_csv_to_excel(input_file, output_file)
    % 读取 CSV 文件
    data = readtable(input_file, 'Delimiter', ',', 'ReadVariableNames', false);

    % 创建空单元格数组用于保存结果
    result = cell(height(data) + 1, 5);  % 增加1行用于标题
    result(1, :) = {'FC_DATA', 'FC_TIMESTAMP', 'SC_ID', 'SC_DATA', 'SC_TIMESTAMP'};  % 更新标题行

    % 遍历每一行数据
    for i = 1:height(data)
        frame_type = data{i, 3}{1};
        frame_data = data{i, 5}{1};
        frame_id = data{i, 4}{1};  % 获取增强串行帧的 ID
        timestamp = data{i, 11};

        if strcmp(frame_type, '快速通道帧')
            result{i + 1, 1} = frame_data;
            result{i + 1, 2} = timestamp;
        elseif strcmp(frame_type, '增强串行帧')
            result{i + 1, 3} = frame_id;
            result{i + 1, 4} = frame_data;
            result{i + 1, 5} = timestamp;
        end
    end

    % 将结果保存为 Excel 文件
    result_table = cell2table(result(2:end, :), 'VariableNames', result(1, :));
    writetable(result_table, output_file, 'WriteVariableNames', true);
end

效果

添加数据处理功能

function transform_csv_to_excel(input_file, output_file)
    % 读取 CSV 文件
    data = readtable(input_file, 'Delimiter', ',', 'ReadVariableNames', false);

    % 创建空单元格数组用于保存结果
    result = cell(height(data) + 1, 8);  % 增加1行用于标题
    result(1, :) = {'FC_DATA', 'FC_TIMESTAMP', 'FC1', 'FC2', 'SC_ID', 'SC_DATA', 'SC_TIMESTAMP', 'SC_DATA_DEC'};  % 更新标题行

    % 遍历每一行数据
    for i = 1:height(data)
        frame_type = data{i, 3}{1};
        original_data = data{i, 5}{1};
        frame_id = data{i, 4}{1};  % 获取增强串行帧的 ID
        timestamp = data{i, 11};

        % 处理A列数据
        compact_data = strrep(original_data, ' ', '');  % 移除空格
        part1 = compact_data(1:end-3);  % 取前部分
        part2 = compact_data(end-2:end);  % 取后三个字符
        reversed_part2 = fliplr(part2);  % 倒序

        % 十六进制转十进制
        hex_to_dec1 = hex2dec(part1);
        hex_to_dec2 = hex2dec(reversed_part2);

        if strcmp(frame_type, '快速通道帧')
            result{i + 1, 1} = compact_data;
            result{i + 1, 2} = timestamp;
            result{i + 1, 3} = round((hex_to_dec1 / 3 - 73.15), 3);
            result{i + 1, 4} = round((hex_to_dec2 / 3 - 73.15), 3);
        elseif strcmp(frame_type, '增强串行帧')
            if ~strcmp(frame_id, '01') % 如果 SC_ID 不是 '01',则进行处理
                sc_data_dec = hex2dec(original_data);  % 将 SC_DATA 由十六进制转为十进制
                result{i + 1, 8} = round((sc_data_dec / 3 - 73.15), 3);
            end
            result{i + 1, 5} = frame_id;
            result{i + 1, 6} = original_data;
            result{i + 1, 7} = timestamp;
        end
    end

    % 将结果保存为 Excel 文件
    result_table = cell2table(result(2:end, :), 'VariableNames', result(1, :));
    writetable(result_table, output_file, 'WriteVariableNames', true);
end

处理效果

适用于ZY(FC2倒序)

添加绘图功能,将四条曲线绘制在同一张图中

function transform_csv_to_excel(input_file, output_file)
    % 读取 CSV 文件
    data = readtable(input_file, 'Delimiter', ',', 'ReadVariableNames', false);

    % 创建空单元格数组用于保存结果
    result = cell(height(data) + 1, 8);  % 增加1行用于标题
    result{1, 1} = 'FC_DATA';
    result{1, 2} = 'FC_TIMESTAMP';
    result{1, 3} = 'FC1';
    result{1, 4} = 'FC2';
    result{1, 5} = 'SC_ID';
    result{1, 6} = 'SC_DATA';
    result{1, 7} = 'SC_TIMESTAMP';
    result{1, 8} = 'SC_DATA_DEC';  % 单独设置每个标题

    % 初始化用于绘图的变量
    timestamps = [];
    fc1_values = [];
    fc2_values = [];
    e3_values = [];
    e4_values = [];
    e3_timestamps = [];
    e4_timestamps = [];

    % 遍历每一行数据
    for i = 1:height(data)
        frame_type = data{i, 3}{1};
        original_data = data{i, 5}{1};
        frame_id = data{i, 4}{1};  % 获取增强串行帧的 ID
        timestamp = data{i, 11};

        % 处理A列数据
        compact_data = strrep(original_data, ' ', '');  % 移除空格
        part1 = compact_data(1:end-3);  % 取前部分
        part2 = compact_data(end-2:end);  % 取后三个字符
        reversed_part2 = fliplr(part2);  % 倒序

        % 十六进制转十进制
        hex_to_dec1 = hex2dec(part1);
        hex_to_dec2 = hex2dec(reversed_part2);

        if strcmp(frame_type, '快速通道帧')
            result{i + 1, 1} = compact_data;
            result{i + 1, 2} = timestamp;
            result{i + 1, 3} = round((hex_to_dec1 / 3 - 73.15), 3);
            result{i + 1, 4} = round((hex_to_dec2 / 3 - 73.15), 3);
            % 为绘图收集数据
            timestamps = [timestamps; timestamp];
            fc1_values = [fc1_values; round((hex_to_dec1 / 3 - 73.15), 3)];
            fc2_values = [fc2_values; round((hex_to_dec2 / 3 - 73.15), 3)];
        elseif strcmp(frame_type, '增强串行帧')
            if ~strcmp(frame_id, '01') % 如果 SC_ID 不是 '01',则进行处理
                sc_data_dec = round((hex2dec(original_data) / 3 - 73.15), 3);
                result{i + 1, 8} = sc_data_dec;
                if strcmp(frame_id, 'E3')
                    e3_values = [e3_values; sc_data_dec];
                    e3_timestamps = [e3_timestamps; timestamp];
                elseif strcmp(frame_id, 'E4')
                    e4_values = [e4_values; sc_data_dec];
                    e4_timestamps = [e4_timestamps; timestamp];
                end
            end
            result{i + 1, 5} = frame_id;
            result{i + 1, 6} = original_data;
            result{i + 1, 7} = timestamp;
        end
    end

    % 将结果保存为 Excel 文件
    result_table = cell2table(result(2:end, :), 'VariableNames', result(1, :));
    writetable(result_table, output_file, 'WriteVariableNames', true);

    % 绘制 FC1, FC2, E3, E4 的曲线
    figure;
    hold on;
    plot(timestamps, fc1_values, '-o', 'DisplayName', 'FC1');
    plot(timestamps, fc2_values, '-x', 'DisplayName', 'FC2');
    plot(e3_timestamps, e3_values, '-*', 'DisplayName', 'E3');
    plot(e4_timestamps, e4_values, '-s', 'DisplayName', 'E4');
    hold off;
    xlabel('Time Stamp (FC_TIMESTAMP)');
    ylabel('Value');
    title('FC1, FC2, E3, and E4 vs Time Stamp');
    legend show;
end

出图效果

改进方向:

封装成一个APP、一次性读取一整个文件夹中的所有文件并输出到指定文件夹

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值