MATLAB如何使用 readtable 优化百万级别CSV文件的读取速度
创作时间:
作者:
@小白创作中心
MATLAB如何使用 readtable 优化百万级别CSV文件的读取速度
引用
CSDN
1.
https://blog.csdn.net/frankgis/article/details/146464183
本文介绍了一种使用MATLAB处理大规模CSV文件的方法,通过使用readtable函数来优化读取速度,并详细描述了整个数据处理流程,包括读取数据、处理日期列、转换分类数据、合并结果以及删除重复行等步骤。
前言
用于处理位于指定目录下的多个CSV文件,通过读取数据、处理日期列、转换分类数据、合并结果以及删除重复行,最终将处理后的数据保存为MAT文件。使用 readtable 读取数据,以提高读取效率,并通过向量化操作和逻辑索引提高代码效率。
方法 | 适用情况 | 速度 | 解析能力 |
---|---|---|---|
readmatrix | 纯数值数据 | 快 | 不支持文本 |
readcell | 混合数据(文本+数值+日期) | 慢 | 保留原始数据 |
readtable | 混合数据,返回表格数据 | 适中 | 强大 |
代码
% 设置主目录路径,指向包含CSV文件的文件夹
mainFolder = '\CSV\';
% 获取主目录下的所有CSV文件
csvFiles = dir(fullfile(mainFolder, '*.csv'));
% 初始化一个空数组,用于存储所有CSV文件的处理结果
allData = [];
% 遍历所有CSV文件
for i = 1:length(csvFiles)
% 获取当前CSV文件的完整路径
csvFilePath = fullfile(mainFolder, csvFiles(i).name);
% 使用 readtable 读取CSV文件,'PreserveVariableNames' 保留变量名
T = readtable(csvFilePath, 'PreserveVariableNames', true);
% 确保数据非空,并且列数足够(至少14列)
if isempty(T) || size(T, 2) < 14
continue; % 跳过不符合要求的文件
end
% 处理第6列(日期列),转换为 YYYYMMDD 格式
% 判断日期列是字符串还是 datetime 类型,进行相应转换
if iscell(T{:,6}) % 如果日期列是字符串格式
dateCol = datetime(T{:,6}, 'InputFormat', 'yyyy/MM/dd', 'Format', 'yyyyMMdd'); % 转换为 datetime
else % 如果已经是 datetime 类型
dateCol = T{:,6}; % 直接使用原数据
end
% 将日期列转换为 YYYYMMDD 格式
formattedDate = year(dateCol) * 10000 + month(dateCol) * 100 + day(dateCol);
% 处理第14列(分类数据),将 'D' 转换为 1,'N' 转换为 2
classCol = strings(size(T,1),1); % 预分配字符串数组
classCol(strcmp(T{:,14}, 'D')) = "1"; % 'D' 对应 1
classCol(strcmp(T{:,14}, 'N')) = "2"; % 'N' 对应 2
classCol = str2double(classCol); % 将字符串转换为数值
% 仅保留需要的列 (第1, 2, 6, 7, 13, 14列)
selectedData = [T{:,1}, T{:,2}, formattedDate, T{:,7}, T{:,13}, classCol];
% 将当前文件的处理结果追加到 allData 数组中
allData = [allData; selectedData];
% 生成保存MAT文件的路径,替换文件扩展名为 .mat
matFileName = fullfile(mainFolder, replace(csvFiles(i).name, '.csv', '.mat'));
% 保存处理后的数据到MAT文件
save(matFileName, 'selectedData');
% 输出处理信息,确认文件已保存
fprintf('已处理并保存: %s\n', matFileName);
end
% 删除 allData 中的重复行
[allDataunique, ~, ~] = unique(allData, 'rows'); % 使用 unique 函数按行去重
% 生成合并后的MAT文件名
mergedMatFile = fullfile(mainFolder, 'merged_data.mat');
% 将去重后的数据保存到一个新的 MAT 文件
save(mergedMatFile, 'allDataunique');
% 输出所有文件处理完成的信息
disp('所有文件处理完成!');
总结
- 设置主目录路径:指定存放CSV文件的文件夹路径。
- 获取CSV文件列表:使用 dir 函数获取该文件夹中所有CSV文件的名称。
- 初始化数据存储容器:allData 用于存储所有处理后的数据。
- 遍历CSV文件:循环处理每个CSV文件,逐个读取文件并进行数据处理。
- 读取数据:使用 readtable 函数读取CSV文件,参数 PreserveVariableNames 保证读取时保留原始列名。
- 检查数据有效性:如果表格为空或列数不足(小于14列),跳过该文件。
- 日期列处理:通过判断日期列是否为字符串格式或已是 datetime 类型,分别进行相应的转换。
- 日期格式转换:将日期列转换为 YYYYMMDD 格式,方便后续处理。
- 处理分类数据:将第14列中的 ‘D’ 转换为数值 1,‘N’ 转换为数值 2。其他值转换为 NaN。
- 选择所需的列:从表格中提取所需的列,形成新的数据集 selectedData。
- 数据拼接:将当前文件的处理结果追加到 allData 数组中,累计处理所有文件的数据。
- 保存数据到MAT文件:为每个CSV文件生成一个 .mat 文件并保存数据。
- 删除重复行:使用 unique 函数去除 allData 中的重复行,保证数据的唯一性。
- 保存合并后的数据:将去重后的数据保存为一个新的 .mat 文件。
- 输出处理完成信息:在处理完成后,输出提示信息,确保用户知道数据已处理完毕。
热门推荐
大连海鲜烧烤:舌尖上的浪漫之都
伪满时期的东北经济:屈辱的繁荣
抗日战争期间,日本在中国扶持的典型傀儡政权
高源:43年镜头下的天安门广场
跟着小敏姐游北京:天安门广场与故宫深度体验
猫咪健康管理:从幼年到老年,每个阶段都不能马虎!
猫咪年龄换算新标准:科学养猫指南
中药治疗高血压:辨证施治与临床应用
胡歌演技封神?从《琅琊榜》到新剧争议
春节追剧:从《琅琊榜》看古代权谋智慧
梅长苏扶持北燕六皇子上位,靖王竟不知情?
胡歌演绎梅长苏:剧版 vs 原著大揭秘!
血糖正常值要控制在多少?不同年齡階段的血糖控制範圍
血糖监测仪大变局:国产品牌的全力一击
参加葬礼有哪些悼念礼仪和注意事项?
自驾游天安门:国庆攻略大揭秘!
秋冬打卡天安门广场:最佳时机与实用攻略
天安门广场:见证中国近代史变迁的国家象征
天安门广场门票秒杀攻略!用微信小程序轻松搞定
《六姊妹》:在奋力生活的鲜活群像里,看到平凡百姓的幸福缩影
京娘湖:赵匡胤千里送京娘的浪漫传说
京娘湖:夏日避暑天堂,你错过了吗?
滑石古寨:重庆梁平的网红打卡地
双峰山滑石村:党建引领下的乡村振兴样本
碧江区滑石乡:白水贡米丰收季
北洋军阀兴衰史——昙花一现的“张勋复辟”闹剧始末(上)
银行的储蓄存单丢失了怎么办?
皓月公主同款红枣汤,你get了吗?
【实证营养学】枸杞功效全新统整!明星护眼草本植物?
山药豆去皮or不去皮:健康选择大揭秘