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 文件。
- 输出处理完成信息:在处理完成后,输出提示信息,确保用户知道数据已处理完毕。
热门推荐
生态大米:绿色种植的健康之选
维生素C可以淡斑吗
什麼是「愛之語」?以五種愛的語言提升親子關係
婚前买房还是婚后买房?拆迁房登记谁名下?离婚与过户的先后顺序
华为正式进军人形机器人领域,最快明年量产,有望带动产业链快速发展
苹果煮红枣枸杞,比补品更养生!养颜、补气血、提升免疫力
专升本专业选择指南:兴趣与就业市场双重考量
精密冲压模具维护技巧:确保寿命与性能
心理医生应该挂哪个科?去哪里看?费用多少?
芒种节气养生须防上火和内生湿热
5岁孩子全口乳磨牙全蛀!专家提醒:定期口腔检查很重要
候选人背调全流程指南:数据驱动时代如何做透入职尽调
一文搞懂空调氟机与空调水机原理和常见机型
银行理财产品的销售话术优化策略
同事之间沟通总是存在误解,原因何在及如何解决
如何自动生成C语言代码
热门“防静电神器”鉴定,这一种真的不建议买!
仰望星空,和“科学传播达人”一起探索宇宙奥秘
正念是通过专注于当下
Django视图与URLs路由详解
杭椒线椒美人椒有什么区别,外观、口感、食用方法均不同
生理期可以做运动吗
地下车库出入口数量与建筑物的安全管理
咳嗽晚餐吃什么比较好一点
互联网时代适合做的六个小项目
碳化硅陶瓷压头高温导热性能
NewJeans改名NJZ:与青春暗语互文,从工业裂缝出走
浅谈舞蹈演员的肢体语言与心理感受
帕金森导致言语障碍,患者受到沉重的打击,坚持4要素
蛋白粉怎么冲泡好喝