【Matlab】---按序遍历文件夹下所有文件

Emmmmm~
最近在做数学建模模拟训练,昨天做的一道题是对红楼梦的作者进行解析,通过数据判断不同章回的作者。写这个题的时候查阅了很多资料,也咨询了很多同学,发现有一个思路是统计120回每一回中某一个虚词的词频。
在这之前已经掌握了用MATLAB统计一个文件中某一词语词频的方法,然后又很惊喜从同学那里得到了按章回分好的120回,120个文件,并放入了一个文件夹。
(PS:哎一开始连fopen()函数的用法都不知道呢,还问了一下同学,得到的答案是这样的:
fopen()函数第一个参数是要打开或创建的文件的名称,默认的位置是桌面,即‘C:\desktop’,但是如果文件不在桌面,也就是说文件不能从桌面直接得到,比如桌面上文件夹里的文件,就不能直接得到。那么这个时候第一个参数就是文件所在的位置和文件的名称,找到该文件所在的位置。比如某文件0001.txt在桌面上的文件夹‘红楼梦’里,那么第一个参数就是‘C:\Users\Shuxin\红楼梦\0001.txt’.!!!
千万要注意这一点哦!!!)
然后就陷入了沉思,怎样才能用程序实现一次依次访问120个文件,然后输出120个结果呢?也就是说如何按序访问一个文件夹下的所有文件呢?
通过疯狂百度,了解到了dir(),fullfile()等函数。
dir()函数的作用:返回文件夹中的所有文件或者文件夹所组成的列表。
函数所引用的第一个参数是文件夹的地址,及路径。
函数返回值是文件夹的属性,是一系列结构体类型的数组。
eg:file=dir(name)%返回name的属性,是一系列结构体类型的数组。
结构体成员有:name
date
bytes
isdir
datenum

然后通过size(file)函数,可以返回数组的维度,得到文件夹下子文件的个数。

这里需要注意的一点是,文件夹下我们可以有120个文件,因为120回嘛,但是size()函数返回值是122,比120多了2,这是为什么呢?通过查资料才知道,原来啊,文件夹下前两个子文件,一个是‘.’,一个是‘..’。
所以我们的第一回‘0001.txt’实际上是第3个子文件哦。

然后通过循环好像就可以得到每一个子文件了哟,file(i)这个结构体里面存储的是第i个子文件的所有信息,通过file(i).name得到该子文件的名字,比如‘0001.txt’。

但是在用fopen()函数的时候,上面也有提到,需要写的是文件的位置和名字即完整的文件名。那么如何将位置和file(i).name联系在一起呢?在尝试过各种错误之后(因为file(i).name返回值是带有引号的,所以其实是不可以用传统的方式直接将两个字符串连接起来),终于找到了一个函数:fullfile()函数,nice!

fullfile函数作用:是利用文件各部分信息创建并合成完整文件名。
比如:
f=fullfile(‘C:’,’Applications’,’matlab’,’fun.m’)
返回f=C:\Applications\matlab\fun.m
所以这个问题里面

filepath=fullfile(‘C:\Users\Shuxin\desktop\红楼梦’,file(i).name)
得到filepath=C:\Users\Shuxin\desktop\红楼梦\0001.txt

然后fopen()就可以正常使用啦。
接下来就是fscanf()函数:
fscanf()函数
A=fscanf(),从fopen打开的文件中读取数据存入A中,A是矩阵的形式呢。

```clear
clc
file=dir('C:\Users\ShuXin\Desktop\红楼梦')%文件夹的名字,返回结构体数组
k=size(file)        %文件个数
ch=input('请输入要查找的字符:\n','s')
m=length(ch)
for i=1:k           %循环
         name=file(i).name                          %子文件名
    if i>2
        filepath=fullfile('C:\Users\ShuXin\Desktop\红楼梦',name)%子文件完整位置及名称
        ans=fopen(filepath,'r')                    %打开文件
        cnt=fscanf(ans,'%c')        %ans表示文件是否成功打开,‘%c’表示数据格式
        n=length(cnt)
        ant=0
        for i=1:n-m+1
            if(strcmp(cnt(i:i+m-1),ch))
                ant=ant+1;
            end
        end
        fprintf('第%d回里总共有%d个%s\n',i,ant,ch)
    end
end

你可能感兴趣的:(Matlab)