问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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 文件。
  • 输出处理完成信息:在处理完成后,输出提示信息,确保用户知道数据已处理完毕。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号