找回密码
 注册
Simdroid-非首页
查看: 208|回复: 16

matlab 进行批处理文件时出错,找不到原因!

[复制链接]
发表于 2010-11-27 01:01:41 | 显示全部楼层 |阅读模式 来自 甘肃兰州
想处理多个数据文件,运行程序处理单个文件时已经能够实现,现在通过读取指定路径文件名的方法,将文件名读入,并附给字符变量i_name,希望通过循环能够实现批处理,可是在原来单个运行能够执行的地方出错,找不到原因,帮忙看看,谢谢!



i_name = [fj-4du-4hz.dat
                fj-5du-4hz.dat
                fj-6du-4hz.dat];
[m,n]=size(i_name);
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
for p = 1:m;
    u_name=strcat('u_',i_name(m));                      % 此处只输出最后一个文件名
    fidin=fopen('i_name','r');
    fidout=fopen('u_name','w');                              %将文件名存入已建文件
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
while ~feof(fidin)                                            % 单独运行这儿没问题,可是在这里提示出错      
     tline=fgetl(fidin);                                      % 从文件读行     
   if ~isempty(tline)&&tline(1)>='0'&&tline(1)<='9'           % 判断首字符是否是数值
      fprintf(fidout,'%s\r\n',tline);                         % 如果是数字行,把此行数据写入文件chulihou.txt
        continue                                              % 如果是非数字继续下一次循环   
   end
end
end
fclose (fid);
fclose (fidin);
fclose (fidout);
发表于 2010-11-27 09:35:08 | 显示全部楼层 来自 浙江杭州
Simdroid开发平台
本帖最后由 hylovegj 于 2010-11-27 11:15 编辑

  1. i_name = ['fj-4du-4hz.dat'
  2.                  'fj-5du-4hz.dat'
  3.                  'fj-6du-4hz.dat'];
  4. fidout=fopen('chulihou.txt','w');
  5. for i = 1:3
  6.     u_name(i)=strcat('u_',i_name(i));
  7.     fidin=fopen(i_name(i),'r');
  8.     fprintf(fidout,'%s',u_name(i));
  9.     fprintf(fidout,'\n');
  10.     while ~feof(fidin)
  11.         tline=fgetl(fidin);
  12.         if ~isnan(str2double(strread(tline,'%s%*[^\n]')))
  13.             fprintf(fidout,'%s',tline);
  14.             fprintf(fidout,'\n');
  15.         else
  16.             continue;
  17.         end
  18.     end
  19. fclose (fidin);
  20. end
  21. fclose (fidout);
  22. clear;
复制代码
回复 不支持

使用道具 举报

发表于 2010-11-27 09:47:46 | 显示全部楼层 来自 浙江杭州
本帖最后由 hylovegj 于 2010-11-27 09:50 编辑

      哥哥,你的程序写得够乱的,我完全看不出来你想做什么。我的理解是你想把fj-4du-4hz.dat、fj-5du-4hz.dat和fj-6du-4hz.dat这三个文件中的数值型数据(以数字开头的行中的数据)写入chulihou.txt文件,程序执行后chulihou.txt文件中的内容应当是

u_fj-4du-4hz.dat
你所提取的数据
ui_fj-5du-4hz.dat
你所提取的数据
ui_fj-6du-4hz.dat
你所提取的数据


      如果是这样,我的程序应该能实现你要的功能。因为没有你要从中提取数据的那三个文件,所以无法帮你调试程序。如果有错,请追问。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-27 10:27:04 | 显示全部楼层 来自 甘肃兰州
不好意思啊,我没说清楚,
是有多个数据文件,其中含数据和字符,单个处理时把其中的数据读出并保存在一个文件内。现在我想一次把一个文件夹下的多个数据文件进行这样的处理,处理后的数据文件另存为“u_原文件名”的名字。如果处理后的数据能另存为新建的一个目录下就更好了。
再帮忙看看,上面的程序刚才我运行了,实现不了,谢谢啊!


每个文件的数据如下(格式相同):
Temperature -13 deg_C
Operator Information End
Data Acquisition   Preload Data   Time: 42.833984 Sec 11/8/2010 1:51:33 PM
Time Axial Displacement Axial Force Confining Displacement Confining Pressure

Sec mm kN mm MPa
12.234619 25.866014 -0.28899339 130.95151 0.032512732
40.234619 0.0014054775 -0.97908342 135.41354 0.28755701
40.734619 0.0022423267 -0.97924072 135.44521 0.29236361
41.234619 0.0018614531 -0.99580288 135.47627 0.29657686
41.734619 0.0026661158 -1.0136685 135.51547 0.30159634
42.234619 0.002438128 -1.0365298 135.54652 0.30553156
42.734619 0.0015449524 -1.0270188 135.57671 0.30974835

Data Acquisition   Hold Data   Time: 1842.8442 Sec 11/8/2010 2:21:34 PM
Time Axial Displacement Axial Force Confining Displacement Confining Pressure
Sec mm kN mm MPa

43.842773 0.0012686849 -1.0467416 135.63153 0.3153342
44.842773 0.00112921 -1.0617769 135.6525 0.31523082
45.842773 0.00036478043 -1.0623968 135.65942 0.31372055
46.842773 0.00070810318 -1.0411634 135.66548 0.31334537
47.842773 0.00083953142 -1.075087 135.66881 0.31109512
48.842773 0.00083953142 -1.0482372 135.66808 0.31025884
87.842773 0.00054717064 -1.0151838 135.71162 0.30354327

Data Acquisition   Hold Data   Time: 1842.8442 Sec 11/8/2010 2:21:34 PM
Time Axial Displacement Axial Force Confining Displacement Confining Pressure
Sec mm kN mm MPa

43.842773 0.0012686849 -1.0467416 135.63153 0.3153342
44.842773 0.00112921 -1.0617769 135.6525 0.31523082
45.842773 0.00036478043 -1.0623968 135.65942 0.31372055
46.842773 0.00070810318 -1.0411634 135.66548 0.31334537
47.842773 0.00083953142 -1.075087 135.66881 0.31109512
48.842773 0.00083953142 -1.0482372 135.66808 0.31025884
87.842773 0.00054717064 -1.0151838 135.71162 0.30354327
回复 不支持

使用道具 举报

发表于 2010-11-27 11:03:04 | 显示全部楼层 来自 浙江杭州
本帖最后由 hylovegj 于 2010-11-27 11:16 编辑

  1. i_name = ['fj-4du-4hz.dat'
  2.                 'fj-5du-4hz.dat'
  3.                 'fj-6du-4hz.dat'];
  4. for i = 1:3
  5.     u_name(i)=strcat('u_',i_name(i));
  6.     fidin=fopen(i_name(i),'r');
  7.     fidout=fopen(u_name(i),'w');
  8.     while ~feof(fidin)
  9.         tline = fgetl(fid);
  10.         if isnan(str2double(strread(tline,'%s%*[^\n]')))|isempty(fid)
  11.             continue;
  12.         else
  13.             fprintf(fidout,'%s',tline);
  14.             fprintf(fidout,'\n');
  15.         end
  16.     end
  17.     fclose (fidin);
  18.     fclose (fidout);
  19. end
  20. clear;
复制代码
你再运行看看

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-27 11:36:33 | 显示全部楼层 来自 甘肃兰州
提示错误, ??? Conversion to cell from char is not possible. Error in ==> Untitled at 11 u_name(i)=strcat('u_',i_name(i));
我上传两个小的数据文件,方便您试运行,谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2010-11-27 12:09:41 | 显示全部楼层 来自 浙江杭州
本帖最后由 hylovegj 于 2010-11-27 12:19 编辑

  1. i_name = ['fjzai(-2du-0.3kn).dat';'fjzai(-2du-0.4kn).dat';'fjzai(-2du-0.5kn).dat'];
  2. for i = 1:3
  3.     u_name(i,:) = strcat('u_',i_name(i,:));
  4.     fidin = fopen(i_name(i,:),'r');
  5.     fidout = fopen(u_name(i,:),'w');
  6.     while ~feof(fidin)
  7.         tline = fgetl(fidin);
  8.         if isempty(tline)|isnan(str2double(strread(tline,'%s%*[^\n]')))
  9.             continue;
  10.         else
  11.             fprintf(fidout,'%s',tline);
  12.             fprintf(fidout,'\n');
  13.         end
  14.     end
  15.     fclose (fidin);
  16.     fclose (fidout);
  17. end
  18. clear;
复制代码
我调试过了,现在没问题了。但是你传上来的三个文件中前面两个文件的文件名末尾有空格,不知道怎么回事,我手动把它们去掉了。
不好意思,很久没用字符串数组了,前面的代码都在字符串数组的使用上出了问题。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-27 13:28:57 | 显示全部楼层 来自 甘肃兰州
文件名没有空格,删掉就可以,为什么我运行这一行提示错误呢, 我用的是2009a
  u_name(i,:) = strcat('u_',i_name(i,:));
??? Conversion to cell from char is not possible.
Error in ==> Untitled2 at 3
    u_name(i,:) = strcat('u_',i_name(i,:));
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-27 14:01:25 | 显示全部楼层 来自 甘肃兰州
请问您用的是2009a版本吗,有时间再帮忙看下,谢谢了!
回复 不支持

使用道具 举报

发表于 2010-11-27 14:40:29 | 显示全部楼层 来自 浙江杭州
本帖最后由 hylovegj 于 2010-11-27 14:42 编辑

我用的是R2007a,在我这边运行是没有问题的。我根本就没有用到细胞数组。在R2007a,普通数组的元素是用方括号对括住的,细胞数组的元素是用花括号对括住的。我不知道这一点在R2009a里是否已改变。如果已改变,当然会出错啦!
回复 不支持

使用道具 举报

发表于 2010-11-27 15:52:23 | 显示全部楼层 来自 河北廊坊
  1. function M=ex02
  2. datFilefinfo=dir('*.dat');
  3. M=cellfun(@myreadata,{datFilefinfo.name}','UniformOutput',false);
  4. strfileName='newFile';% 也可以inputdlg自己输入
  5. mkdir(strfileName);
  6. cd(strfileName);
  7. for i=1:length(datFilefinfo)
  8.     dlmwrite(['u_',datFilefinfo(i).name], M{i}, 'delimiter', '\t', ...
  9.          'precision', 6);
  10. end
  11. cd('..');
  12. function y=myreadata(datFilefinfoName)
  13. y=[];
  14. nheaderlines=[9,20,34];
  15. n=length(nheaderlines);
  16. M = cellfun(@importdata,repmat({datFilefinfoName},n,1),...
  17.     repmat({'\t'},n,1), num2cell(nheaderlines'),...
  18.     'UniformOutput',false);
  19. for i=1:length(M)
  20.     y=[y;M{i}.data];
  21. end
复制代码

这样在newFile的文件夹下生成了你所要的3个文件

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-27 17:28:21 | 显示全部楼层 来自 甘肃兰州
谢谢两位,耐心指导,已经可以运行了。能不能再帮指点一下,上面的程序用2009a应该怎么修改呢。非常感谢!
回复 不支持

使用道具 举报

发表于 2010-11-28 10:35:24 | 显示全部楼层 来自 北京西城
12# loveblue
不知道你说的是什么意思,修改什么东西啊?
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-28 14:15:38 | 显示全部楼层 来自 甘肃兰州
就是hylovegj改过的,在2007a中可以实现的批处理程序,但是我在r2009a中实现不了,提示错误,如下,红色注释。

i_name = ['fjzai(-2du-0.3kn).dat';'fjzai(-2du-0.4kn).dat';'fjzai(-2du-0.5kn).dat'];
for i = 1:3
    u_name(i,:) = strcat('u_',i_name(i,:));
    fidin = fopen(i_name(i,:),'r');
    fidout = fopen(u_name(i,:),'w');!提示输入文件名错误,文件名为字符变量应该是怎样的格式呢?
    while ~feof(fidin)
        tline = fgetl(fidin);
        if isempty(tline)|isnan(str2double(strread(tline,'%s%*[^\n]')))
            continue;
        else
            fprintf(fidout,'%s',tline);
            fprintf(fidout,'\n');
        end
    end
    fclose (fidin);
    fclose (fidout);
end
clear;
回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-28 17:03:53 | 显示全部楼层 来自 甘肃兰州
想依次读取数组a中每一行为名字的数据文件,2009a格式应该是怎么写呢。

a=[file1.txt;file1.txt;file1.txt];
[row,col]=size(a)
for i=1:m
fid=fopen(a,'r');fid=fopen(a(i),'r');fid=fopen(a(i,:),'r'););!都不对,应该怎样的格式呢?
回复 不支持

使用道具 举报

发表于 2010-11-29 10:06:58 | 显示全部楼层 来自 天津
a=[file1.txt;file1.txt;file1.txt];
没有你这样的定义方式,所以出错了.可以用a={'file1.txt';'file1.txt';'file1.txt'};来实现,其中a{1}就是'file1.txt'.

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-11-29 18:26:48 | 显示全部楼层 来自 甘肃兰州
可以实现了,谢谢大家帮忙!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 23:46 , Processed in 0.073120 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表