Scilab读取CSV发动机日志列识别异常 无法提取各PID参数极值
你遇到的CSV读取单列、数值全为NaN、Excel计算极值一致的问题,均为配置错误和基础语法错误导致,按以下步骤修复即可:
1. 修复基础语法错误
你初始代码中Data=csvRead("data",",",[],[],[],[],[],6)的写法完全错误:uigetfile返回的文件名存在变量data中,给data加双引号会让Scilab直接读取一个文件名为data的无后缀文件,根本不会加载你选中的日志。
修正文件选择逻辑:
// 弹出文件选择窗口,获取选中文件的完整路径 file_path = uigetfile(["*.csv"], "选择发动机日志CSV文件");
2. 确认CSV实际分隔符,禁止主观猜测
你先后用逗号、制表符(ascii(9)对应Tab键)作为分隔符均读取失败,核心原因是分隔符和文件实际格式不匹配:
- 不要被
.csv后缀误导,工业设备导出的CSV常使用分号;作为分隔符,部分场景会使用Tab或多空格分隔。 - 验证方法:把CSV后缀改为
.txt用记事本打开,直接观察同一行相邻两个数据之间的间隔字符,用该字符作为csvRead的分隔符参数即可。 - 如果打开后文件开头出现
乱码,是UTF-8 BOM编码格式不兼容,将文件另存为「UTF-8无BOM」或ANSI编码后再读取。
3. 正确配置csvRead读取参数
csvRead参数顺序不要随意传值,同时要实际核对需要跳过的表头行数:打开文件数清楚前6行是否全为非数据表头,确认第一行有效数据的起始位置。
正确读取代码参考(以逗号分隔、跳过前6行表头为例):
// 先以字符串格式读取全量内容,避免自动转数值失败直接返回NaN raw_data = csvRead( file_path, // 要读取的文件路径,变量不要加引号 ",", // 和实际匹配的分隔符 ".", // 数值的小数点符号,默认是点 [], // 字符串转义符,默认双引号 [], // 要跳过的特定行,无特殊需求留空 "string", // 先全部读为字符串,避免格式兼容问题 6 // 跳过前6行表头,按实际行数修改 ); // 将字符串数组转换为数值数组,非数值内容自动转为NaN,后续计算时自动跳过 num_data = strtod(raw_data); // 执行后查看维度,正常应返回「有效数据行数, 69」 disp(size(num_data));
如果实际分隔符为分号,把第二个参数改为";";如果为Tab分隔,改为ascii(9)即可。
4. 提取各PID参数的极值
数据正确读取后,直接调用内置函数按列计算即可,函数会自动跳过NaN值:
// 按列计算最小值、最大值,'r'代表按行维度聚合,返回每列的统计值 col_min = min(num_data, 'r'); col_max = max(num_data, 'r'); // 如果需要绑定PID参数名,单独读取表头中对应参数名的行做映射即可
5. Excel计算极值相同的修复方法
该问题是因为Excel默认把日志中的数值识别为文本格式,文本比较按字符编码顺序而非数值大小计算,导致结果异常。修复方法:选中所有数据列,点击顶部菜单栏「数据-分列」,直接点击完成,强制将文本转换为数值后,再计算MAX、MIN即可得到正确结果。
验证方法
你自制的测试文件读取失败也是分隔符不匹配导致:测试文件中用多空格分隔字段,但代码用Tab作为分隔符,自然识别为单列。可以先将测试文件的多空格统一替换为逗号,用上述代码读取,若能返回4行4列的数值矩阵,说明代码逻辑正确,再调整参数读取实际日志即可。
内容的提问来源于stack exchange,提问作者Ryan LaRue

