• 数据的读取和保存-MATLAB


    1 序言

    在进行数据处理时,经常需要写代码对保存在文件中的数据进行读取→处理→保存的操作,流程图如下:

    笔者每次在进行上述操作时,都需要百度如何“选中目标文件”以及如何“将处理好的数据保存到目标文件中”,对这一块的知识点的掌握不够系统化。为了以后减少百度的次数,故对选中目标文件和保存到目标文件这两个步骤进行了梳理。

    2 选中目标文件&数据读取

    选中目标文件和数据读取是连在一起的,它们合在一起的意思是读取存放在目标文件里目标位置的数据。数据读取没有太多可讲的,选择目标文件后,只要已知数据存放在文件里的位置以及类型即可读取对应的数据。

    选中目标文件需要已知目标文件存放的路径(下文简称文件路径)和目标文件的名称(文件名称),一般会有如下4个场景:

    1. 文件路径未知,文件名未知;
    2. 文件路径未知,文件名已知;
    3. 文件路径已知,文件名未知;
    4. 文件路径已知,文件名已知。

    下面对上述四个场景的实现方法进行详细介绍。

    2.1 文件路径未知,文件名未知

    这种场景的实现方法是直接采用弹框的形式,当程序运行后在弹框界面人为打开文件路径,然后在文件路径下选中目标文件。关键函数为uigetfile,用法如下:

    [file,path,indx] = uigetfile(filter)

    输出参数意义如下:
    file—返回的文件名;
    path—返回的文件路径;
    indx—返回的在对话框中选择的筛选器的索引。

    输入参数意义如下:
    filter—指定文件扩展名,根据该扩展名筛选对话框中显示的文件。

    实现“文件路径未知,文件名未知”的代码如下:

    1. clear
    2. close all
    3. clc
    4. %--------存放的路径未知,文件名未知
    5. [name,path,index] = uigetfile('*') %选择目标文件,*表示可以选择所有格式的文件
    6. data = csvread(fullfile(path,name)); %读取目标文件中的数据

    运行效果如下:

    选中目标文件'data.csv',然后点击打开即可读取目标文件中的数据。

    2.2 文件路径未知,文件名已知;

    这种场景的实现方法是直接采用弹框的形式,当程序运行后在弹框界面人为选中目标文件存放的路径。关键函数为uigetdir,用法如下:

    selpath = uigetdir(path)

    输入参数的意义:

    path为初始路径,当path为空时,弹框打开的是当前文件路径;

    输出参数的意义:

    selpath为选择的路径。

    实现“文件路径未知,文件名已知”的代码如下:

    1. clear
    2. close all
    3. clc
    4. %--------存放的路径未知,文件名已知
    5. path = uigetdir() %选择文件要存放的文件夹路径
    6. name = 'data.csv'; %文件名
    7. data = csvread(fullfile(path,name)); %读取数据

    运行效果如下:

    选中目标文件存放的路径'my_test',然后点击打开即可读取到目标文件中的数据。

    2.3 文件路径已知,文件名未知

    这种场景和“文件路径未知,文件名未知”相似,只需要弹框打开已知的文件路径,然后人为选中目标文件即可,关键函数也是uigetfile。

    实现代码如下:

    1. close all
    2. clc
    3. %--------文件路径已知,文件名未知
    4. path = ''/Users/Desktop/matlab_code/folder_test/my_test'; %存放目标文件的路径
    5. name = uigetfile('*','',path); %从文件路径下的所有文件选择目标文件
    6. data = csvread(fullfile(path,name)); %读取数据

    运行效果和场景“文件路径未知,文件名未知”相似,只是这个直接弹框出来的就是文件路径,如下:

    选中目标文件'data.csv',然后点击打开即可读取目标文件中的数据。

    2.4 文件路径已知,文件名已知

    这种场景实现比较简单,直接将文件路径和文件名写死即可。

    1. clear
    2. close all
    3. clc
    4. %--------存放的路径已知,文件名已知
    5. path = '/Users/Desktop/matlab_code/folder_test/my_test'; %存放目标文件的路径
    6. name = 'my_test.csv'; %文件名
    7. data = csvread(fullfile(path,name)); %读取数据

    3 保存到目标文件 

    待数据处理完成后,需要将数据保存下来,一般会有两种场景:

    ① 将处理好的数据保存到原来的目标文件中,覆盖原始数据;

    ② 新建一个文件,将处理好的数据保存到新的文件中,原始目标文件不变。

    场景①的实现代码如下:

    1. %------将修改好的数据保存在原始文件里面
    2. system('tskill excel'); %关闭所有打开的Excel文件
    3. csvwrite(fullfile(path,name),data);%保存到原始文件里面

    其中data为修改好的数据。由于读取时打开可目标文件,需要先关闭Excel文件,再写入到原始目标文件里,否则会报错。

    场景②的实现代码如下:

    1. %-------将修改好的数据保存到新的文件夹里
    2. path_new = fullfile(path,'new'); %新生成的数据包存放路径
    3. if ~exist(path_new)
    4. mkdir(path_new); %不存在文件名为new的文件夹,则新建一个
    5. end
    6. csvwrite(fullfile(path_new,name),data);

    其中data为修改好的数据。先在文件路径下新建一个名为‘new'的文件夹,再将数据保存到新建的文件夹里。

    4 批量读取和保存

    批量读取和保存的关键点是获取到所有目标文件的文件名,然后通过一个循环进行批量操作。关键函数是dir,用法如下:

    1. dir()函数的调用方式有三种,分别为:
    2. 1、dir(’.’) 列出当前目录下所有子文件夹和文件;
    3. 2、dir(‘E:\Matlab’) 列出指定目录下所有子文件夹和文件;
    4. 3、dir(E:\Matlab,’*.csv’) 列出指定目录下后缀为.csv的文件。

    批量操作的实现代码如下:

    1. clear
    2. close all
    3. clc
    4. path = uigetdir(); %选择文件存放的文件夹路径
    5. excel_files = dir(fullfile(path,'*.csv')); %获取所有后缀是.csv的文件名,如果是’*‘则是获取所有格式的文件名
    6. folder_nums = size(excel_files,1);% 文件夹里csv文件数
    7. for i=1:folder_nums %获取所有文件夹名
    8. excel_file_names{i} = excel_files(i,1).name;
    9. end
    10. for i = 1:folder_nums
    11. excel_file_names{i} %循环处理每个目标文件
    12. end

    5 案例

    5.1 一个目标文件的读取和保存

    读取一个文件路径已知,文件名已知的.csv里的数据,将数据的第一行和第二列改为200,然后将修改后的数据保存到原始的.csv文件里,同时在已知的文件路径下新建一个名'new’的文件夹,将修改后的数据也保存到新建的文件夹下,保存的文件名和原始文件名一样。

    上述要求实现代码如下:

    1. clear
    2. close all
    3. clc
    4. %--------存放的路径未知,文件名已知
    5. path = '/Users/Desktop/matlab_code/folder_test/my_test'; %存放目标文件的路径
    6. name = 'data.csv';
    7. data = csvread(fullfile(path,name)); %读取数据
    8. data(2,2) = 200; %数据操作,将第2行第2列的数改为200
    9. %------将修改好的数据保存在原始文件里面
    10. system('tskill excel'); %关闭所有打开的Excel文件
    11. csvwrite(fullfile(path,name),data);%保存到原始文件里面
    12. %-------将修改好的数据保存到新的文件夹里
    13. path_new = fullfile(path,'new'); %新生成的数据包存放路径
    14. if ~exist(path_new)
    15. mkdir(path_new); %不存在文件名为new的文件夹,则新建一个
    16. end
    17. csvwrite(fullfile(path_new,name),data);
    18. 'done'

    运行前:

     

    运行后:

     

    5.2 多个目标文件的批量读取和保存

    读取多个文件路径已知,文件名未知的.csv里的数据,将数据的第一行和第二列改为200,然后将修改后的数据保存到原始的.csv文件里,同时在已知的文件路径下新建一个名'new’的文件夹,将修改后的数据也保存到新建的文件夹下,保存的文件名和原始文件名一样。

    实现代码如下:

    1. clear
    2. close all
    3. clc
    4. path = '/Users/Desktop/matlab_code/folder_test/my_test'; %选择文件存放的文件夹路径
    5. excel_files = dir(fullfile(path,'*.csv')); %获取所有后缀是.csv的文件名
    6. folder_nums = size(excel_files,1);% 文件夹里csv文件数
    7. for i=1:folder_nums %获取所有文件夹名
    8. excel_file_names{i} = excel_files(i,1).name;
    9. end
    10. for i = 1:folder_nums
    11. target_path = fullfile(path,excel_file_names{i})
    12. data = csvread(target_path); %读取数据
    13. data(2,2) = 300; %数据操作,将第2行第2列的数改为100
    14. %------将修改好的数据保存在原始文件里面
    15. csvwrite(target_path ,data);%保存到原始文件里面
    16. %-------将修改好的数据保存到新的文件夹里
    17. path_new = fullfile(path,'new'); %新生成的数据包存放路径
    18. if ~exist(path_new)
    19. mkdir(path_new); %不存在文件名为new的文件夹,则新建一个
    20. end
    21. csvwrite(target_path,data);
    22. end

    运行前:

    运行后:

    6 其它相关常用函数

    6.1 fullfile

    fullfile函数可以将多个字符串拼接成文件路径,用法如下:

    f = fullfile(filepart1,filepart2,…,filepartN)

    输出:将各个输入用"\"拼接起来

    即:f = ‘filepart1\filepart2\…\filepartN’

    6.2 exist

    exist主要有两种形式,一个参数和两个参数的,作用都是用于确定某值是否存在:

    1. r = exist( a)

          若 a 存在,则 r = 1; 否则 r = 0;

    2. r = exist( 'name', 'kind')

          name 可以是变量名,函数名、m 文件名、mex 文件、dll 文件、内嵌的函数、p码文件、目录、路径、Java class

          kind 表示 name 的类型,可以取的值为:builtin(内建类型),class(类),dir(文件夹),file(文件或文件夹),var(变量)。

    6.3 mkdir

    新建文件夹。语法如下:

    mkdir folderName

    mkdir parentFolder folderName

    status = mkdir(___)

    [status,msg] = mkdir(___)

    [status,msg,msgID] = mkdir(___)

    示例

    mkdir folderName 创建文件夹 folderName。如果 folderName 存在,则 MATLAB® 发出警告。如果操作失败,则 mkdir 会向命令行窗口发出错误。

    示例

    mkdir parentFolder folderName 在 parentFolder 中创建 folderName。如果 parentFolder 不存在,MATLAB 会尝试创建它。

    示例

    status = mkdir(___) 创建指定的文件夹,并在操作成功或文件夹已存在时返回状态 1。否则,mkdir 返回 0,并且不会在命令行窗口中引发警告或错误。您可以将此语法与上述语法中的任何输入参数结合使用。

    示例

    [status,msg] = mkdir(___) 还返回发生的任何警告或错误的消息文本。

    示例

    [status,msg,msgID] = mkdir(___) 还返回发生的任何警告或错误的消息 ID。

    6.4 mfilename 

    获取当前正在运行的代码的文件名。语法如下:

    p = mfilename('fullpath')

    c = mfilename('class')

    说明

    mfilename 返回一个字符向量,其中包含发生函数调用的文件的名称。从文件中调用时,则会返回该文件的名称。这样,脚本或函数就可以确定其名称。

    p = mfilename('fullpath') 返回其中进行了调用的文件的完整路径和名称,不包括文件扩展名。

    某个方法中的 c = mfilename('class') 返回该方法的类,不包括前导的 @ 符号。如果从非方法中调用,则会生成空字符向量。

    6.5 fileparts 

    获取文件名的组成部分全页折叠,语法如下:

    [filepath,name,ext] = fileparts(filename)

    说明

    [filepath,name,ext] = fileparts(filename) 返回指定文件的路径名称、文件名和扩展名。

    fileparts 仅解析指定的 filename。不会验证文件是否存在。

    示例

    file = "H:\user4\matlab\myfile.txt";

    [filepath,name,ext] = fileparts(file)

    filepath = "H:\user4\matlab"

    name = "myfile"

    ext = ".txt"

  • 相关阅读:
    新版TCGA的突变SNP数据添加临床信息
    7 步保障 Kubernetes 集群安全
    Java笔记:Java线程Dump分析
    HarmonyOS/OpenHarmony应用开发-DataAbility开发体验
    临沂大学张继群-智慧农业项目招募
    艾美捷测序级 II,纯化胰蛋白酶实验室使用的测定方法
    美团yolov6初体验
    Linux 下调试之valgrind 工具说明二
    Vue项目实战之电商后台管理系统(八) 订单管理及数据统计模块
    从 Vue2向Vue3的迁移
  • 原文地址:https://blog.csdn.net/dongke1991/article/details/134298955