0

程序 myfile.m 读取一个包含 25 个名称和数字的 txt 文件,例如

例子:

约翰·道拉斯 15986

菲利普公爵 357852

等等。

该程序将它们转换为

15986 Doughlas John
357852 duch Filip 

这是没有功能的,我得到了太多的输出。

Error message:
Error using disp
Too many output arguments.

Error in red4 (line 26)
  array = disp(All);

原代码如下:

function array = myfile(~) 
if nargin == 0 
dirr = '.';
end
answer = dir(dirr);  
k=1;
while k <= length(answer) 
    if answer(k).isdir 
        answer(k)=[]; 
    else
        filename{k}=answer(k).name;
        k=k+1;
    end
 end
chose=menu( 'choose file',filename);
namn = char(filename(chose));  
fid = fopen(namn, 'r');    
R = textscan(fid,'%s %s %s');  
x=-1;                                            
k=0;                                               
while x <= 24                                  
      x = k + 1;                                    
      All = [R{3}{x},'   ',R{1}{x},' ',R{2}{x}];
      disp(All)                                     
      k = k + 1;                                   
end                                                
fclose(fid);

现在我从人们和网站上得到了很多很好的答案,比如函数,但是我不能用函数得到像上面这样的结果。

我尝试将它们结合起来并得到了一些结果:

y = 15986 & [a,z,b] = myfile
y = 25 & myfile = x
y = numbers name1,2,3,4 and so one & myfile = fprintf(All)
y =                       & I used results().namn, 
numbers name 1            & results().id, results().lastname
y =
numbers name 2 and so on.

我想要的结果是:

y = myfile
y =
15986 Doughlas John
357852 duch Filip 

更新:像 Eitan T 说的那样改变它,但没有得到像上面这样的结果。

得到结果:

'约翰·道拉斯 15986'

'菲利普公爵 357852'

function C = myfile()                            
 if nargin == 0 
    dirr = '.';
end
answer = dir(dirr); 
k=1;
while k <= length(answer)   
    if answer(k).isdir 
        answer(k)=[]; 
    else
        filname{k}=answer(k).name;
        k=k+1;
    end
end
chose=menu( 'choose',filname); 
name = char(filname(chose)); 
fid = fopen(name, 'r');
C = textscan(fid, '%s', 'delimiter', '');
C = regexprep(C{1}, '(\w+) (\w+) (\w+)', '$3 $2 $1');
fclose(fid); 
4

1 回答 1

1

为什么要使用循环?立即阅读这些行textscan并使用regexprep来操作单词:

fid = fopen(filename, 'r');
C = textscan(fid, '%s', 'delimiter', '');
C = regexprep(C{1}, '(\w+) (\w+) (\w+)', '$3 $2 $1')
fclose(fid);

结果是一个元胞数组C,每个元胞存储一行。对于您的示例,您将获得一个 2×1 元胞数组:

C = 
    '15986 doughlas John'
    '357852 duch Filip'

我不确定你想用它做什么,但如果你提供更多细节,我可以进一步改进我的答案。

希望这可以帮助!

于 2013-04-15T13:29:40.910 回答