基于Unit列唯一ID将CSV数据拆分至对应新表的技术实现问询
基于Unit列唯一ID将CSV数据拆分至对应新表的技术实现问询
嘿,看起来你已经成功搞定了唯一Unit ID的提取工作,接下来就是把原数据按这些ID拆分到不同的子表里对吧?我来给你梳理下后续的实现方法,顺便优化下你现有的代码~
首先先把你已经完成的提取唯一ID的代码整理成更规范的格式:
% 读取CSV文件为表 data = readtable('Input/Wales_Interim_23/Pembrokeshire_23_Finished.csv'); % 处理Reg_ID提取Unit字段 unit_str = string(data.Reg_ID); split = cellfun(@(x) strsplit(x, '_'), unit_str, 'UniformOutput', false); split_unit_cell = cell2table(split); split_unit = splitvars(split_unit_cell); unit = table2array(split_unit(:,1)); data.Unit = unit; % 获取唯一的Unit ID Ids = unique(data.Unit); NID = numel(Ids);
核心实现:按Unit ID拆分数据到子表
这里最推荐的方式是用结构体来存储所有子表,这样后续管理和调用都很方便,不会产生一堆零散的变量。具体代码如下:
% 创建结构体存储各Unit对应的子表 unitTables = struct(); % 遍历每个唯一ID,筛选对应行并存储 for i = 1:NID currentId = Ids(i); % 筛选当前Unit的所有行,存入结构体对应字段 unitTables.(currentId) = data(data.Unit == currentId, :); end
完成后你就可以通过unitTables.8c12.11或者unitTables.(Ids(1))这类方式,直接访问对应Unit的完整子表啦。
如果你确实需要把每个子表存成单独的工作区变量(不推荐,变量过多会增加管理成本),也可以用eval实现,但要注意这种方式容易引发命名冲突等问题,谨慎使用:
for i = 1:NID currentId = Ids(i); % 动态生成变量名并赋值 eval([currentId, ' = data(data.Unit == currentId, :);']); end
小优化:简化Unit字段的提取逻辑
你之前提取Unit字段的代码有点绕,其实用MATLAB的extractBefore函数可以一行搞定,代码更简洁易读:
data.Unit = extractBefore(string(data.Reg_ID), '_');
这行代码直接从Reg_ID中提取下划线前的内容,完全替代原来的cellfun拆分、转表等一系列操作~
备注:内容来源于stack exchange,提问作者Adam Johns
相关产品推荐
相关产品推荐

