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 文件。
- 输出处理完成信息:在处理完成后,输出提示信息,确保用户知道数据已处理完毕。
热门推荐
炸带鱼的营养真相:美味与健康如何兼得?
炸带鱼前必看!这些小技巧让你远离毒物
炸带鱼酥脆不回软的秘诀
东北春节习俗大揭秘:红红火火过大年!
黄山鱼灯表演:八百年非遗文化的传承与创新
如何利用人工智能和机器学习提高医疗诊断的准确性和效率
科普|针对痴呆、抑郁等精神疾病,多项AI辅助诊疗步入临床应用
AI头像大作战!赢取新年大奖🎁
重阳节后,这些祝福语你用了吗?
仓央嘉措最美情诗:不负如来不负卿
万州自驾游云南腾冲:火山热海、北海湿地、银杏村7天深度游
万州出发,大理自驾游攻略大揭秘!
医疗AI应用的数据隐私保护与合规挑战
国防科技大学:如何成为顶尖军事人才?
国防科技大学:培养未来科技帅才的秘密基地
国防大学&国防科技大学:军校改革新动向
从“小小子儿坐门墩儿”看童谣的教育价值
人工智能在个性化医疗中的应用
“人工智能+”的前瞻实践:打造医疗影像AI国家级平台
讨债需要准备哪些证据
他欠债不还,我就住在他家直到还钱为止,这样的方法真的可行吗?
怎么通过法律途径讨债,有效讨债的条件有哪些
30个情绪调节小窍门,总有一款适合你!
你的情绪管理方式真的有效吗?
如何改变团队负能量
情感智慧:如何有效沟通以加深人际关系
大理特色休闲:打卡杨丽萍经典作品集
龙龛码头:大理最美打卡地,红杉海鸥洱海尽收眼底
白皮书 | 行业深度解析:中国AI在全球舞台的崛起与挑战
2024年度中国第三代半导体技术十大进展揭晓