背景: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、一次性读取一整个文件夹中的所有文件并输出到指定文件夹