为什么文件标识fopen函数中值为1,尽管它似乎已经成功打开和读取文件内容?

14日视图(30天)
我有一个文件夹有多个文本文件,我需要打开每一个读过一些特定信息的内容,最后做一个总结excel文件的每一行包含一个文件名称和secleted具体信息的文件。
我做了一个函数调用 searchData 这需要一个指定的文件夹路径作为输入并返回 filesNumber (有多少文件夹)中发现的数据文件, fileDataSummary (我需要从每个文件的汇总数据), missingFiles (fopen的文件名称列表没有设法打开)以及编写 fileDataSummary 成和excel文件命名 fileDataSummary
我附加一个示例数据文件的文件夹作为演示,结果我得到的excel文件。如果有人想试着运行功能:)
在调用函数之前我选择的目录和特定的数据文件的文件夹的路径
清晰的所有
clc
cd (“C: \ \用户桌面、数据预处理、数据的)
folderPath =“C: \ \用户桌面\数据预处理\ \ 20160502”;
当调用该函数从命令窗口
[filesNumber, dataSummary missingFiles] = searchData (folderPath);
函数似乎每个文件,读取指定的信息,我希望并将它们写入到摘要excel文件。所以一切似乎工作。
但越来越文件标识= 1,errmsg(没有这样的文件或目录)的一些文件,有一个奇怪的charachter像一个十字架(┼)文件名。
下面的两个例子两个文件的名字是:
Rosenb3_LB03_SV41_S。txt(文件标识= 3)
Rosenb3_LB03_V┼_VG。txt(文件标识= 1)
就我而言我有数百万文件的数据文件,其中一些似乎这十字架(┼)在他们的名字。虽然看起来fopen相关阅读打开我仍然得到这个文件标识= 1这应该意味着fopen不能打开文件。
我没有什么意思。我不想开始分析我有完整的数据集,出现错误。
在这里我丢失的东西吗?
函数如下
函数[filesNumber, fileDataSummary missingFiles] = searchData (folderPath)
目录(folderPath);
filesNames = dir (folderPath);
团队= 0;
missingFiles = {};
我= 3:长度(filesNames)
j =我2;
% MATLAB®储备文件标识符0、1和2为标准输入,…
%标准输出(屏幕),分别和标准错误……
%如果fopen不能打开文件,然后文件标识是1。
[文件标识,errmsg] = fopen ((filesNames (i) . name),“r”,“n”,“utf - 8”);
%检查哪些文件打开外部文件无法打开,显示名称、文件标识和错误消息
如果(~ strcmp (errmsg,))
disp (filesNames (i) . name)
disp(文件标识)
disp (errmsg)
团队团队= + 1;
团队missingFiles (1) = {filesNames (i) . name};
其他的
ScanText = textscan(文件标识,' % s % s % s % s % s的);% % s % s % s的是指定textscan应该如何看文件
文件关闭(文件标识);
% fileDataCell包括单元阵列的数据文件
ScanText fileDataCell = [ScanText {1}, {2}, ScanText {3}, ScanText {4}, ScanText {5});
结束
%检查传感器文件名
fileDataSummary (j, 1) = {filesNames (i) . name};
% Enhet检查文件
如果比较字符串(fileDataCell {4 1},“Enhet”)= = 1
fileDataSummary (j, 2) = fileDataCell (4,2);
其他的
fileDataSummary (j, 2) = {strcat (“Enhet不在位置(4,1)”,
“_”,fileDataCell {4,2}};
结束
%检查文件类型
如果比较字符串(fileDataCell {5 1}“IOTyp”)= = 1
fileDataSummary (j, 3) = {strcat (fileDataCell {5, 2},
“_”,fileDataCell {5 3},“_”,fileDataCell {4},“_”,fileDataCell {5, 5}};
其他的fileDataSummary (j, 3) = {strcat (“IOTyp不是位置(5、1)的,
“_”fileDataCell {2},“_”,fileDataCell {5 3},“_”,fileDataCell {5 4}
,“_”,fileDataCell {5, 5}};
结束
%检查的附加信息
如果比较字符串(fileDataCell {6 1},“文本”)= = 1
fileDataSummary (j, 4) = {strcat (fileDataCell {6 2},
“_”,fileDataCell {6,3},“_”4},fileDataCell{6日,“_”,fileDataCell {6 5}};
其他的fileDataSummary (j, 4) = {strcat (的文本不是位置(6,1)”,
“_”2},fileDataCell{6日,“_”,fileDataCell {6,3},“_”,fileDataCell {6 4}
,“_”,fileDataCell {6 4}};
结束
结束
filesNumber =长度(filesNames) 2;
xlswrite (strcat (“C: \用户桌面\ \数据预处理的,“\”,“fileDataSummary.xlsx”),fileDataSummary)
结束
提前谢谢你的帮助!)
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2019年7月11日
另外:
女士的窗户没有承诺的顺序返回文件名:这被认为是一个重要的文件系统,所以订单可以改变从FAT32 NTSF为例。反过来,NTSF没有承诺的顺序返回文件名;实际上它似乎是按字节代码,但是有关于canconicalization unicode序列悬而未决的问题。
ismember () Guillaume 建议能够很好地消除。和. .
您还应该考虑是否应该删除所有其他文件夹的名字可能发生在目录中。

登录置评。

答案(1)

dpb
dpb 2019年7月12日
编辑:dpb 2019年7月12日
此外,:
你的逻辑不马上继续下一个文件 为结束…… 循环后的错误消息,它只是不读那个文件但它然后继续重做所有下面的代码包括写在你的另一个纪录 fileDataSummary 数组,所以不会有任何缺失的条目;只是一些复制特定的值 j 的文件没有打开,相同的数据与前面的循环,因为他们还没有更新。(*)
你需要这样
i = 1:长度(filesNames)
如果filesNames .isdir(我),继续,结束%跳过目录条目
%如果fopen不能打开文件,然后文件标识是1。
[文件标识,errmsg] = fopen ((filesNames (i) . name),“r”,“n”,“utf - 8”);
%检查哪些文件打开外部文件无法打开,显示名称、文件标识和错误消息
如果(文件标识< 0)
disp (filesNames (i) . name)
disp(文件标识)
disp (errmsg)
团队团队= + 1;
团队missingFiles (1) = {filesNames (i) . name};
跟上进展%跳到下一个文件;不收取200美元
其他的
ScanText = textscan(文件标识,' % s % s % s % s % s的);% % s % s % s的是指定textscan应该如何看文件
文件关闭(文件标识);
% fileDataCell包括单元阵列的数据文件
ScanText fileDataCell = [ScanText {1}, {2}, ScanText {3}, ScanText {4}, ScanText {5});
结束
注:我占Guillaume和沃尔特的评论开始循环文件顺序和目录条目的1和检查isdir逻辑值不带他们……你也可以进行预处理,以删除所有元素isdir = = 1。
我喜欢处理这个问题的方法是使用一个file-matching通配符的dir()调用,使用‘*你的例子。csv”将返回所有给定的文件,假设一些纪律不命名目录. csv扩展,除了将返回所需的文件所需的类型。
还NB2:自循环索引从1开始,你需要修理了 j 索引逻辑来使用 相反;还要注意现在将在总结阵列的空地时,文件没有发现没有在你现有的代码,因为上述的逻辑错误。
(*)这是假设至少第一个文件 succuessfully开放;否则你将有一个错误的变量 fileDataCell 不存在如果第一个文件没有成功被阅读。但一旦你读一个,然后似乎表面上好像一切正常时不会导致你错误的假设关于发生了什么 打开外部文件 问题描述的情况实际上并不发生——它了 读取一个文件,没有打开。

下载188bet金宝搏


释放

R2016a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!