从文件名解析数据;循环中的变量赋值与控制台不同

时间:2016-11-30 06:40:17

标签: matlab

我正在尝试从包含任何顺序的某些关键字的文件名中解析一些数据。例如,文件名可以称为paidYes_cashYes_cardNo_billsYes_coinsNo_112916.csv

我想分配每个参数(付费,现金,卡,账单,硬币)是或否,以便我可以使用strcat命令重建文件名。在提供我的文件名的情况下,所需的变量将如下所示:

paid = 'paidYes';
cash = 'cashYes';
card = 'cardNo';
bills = 'billsYes';
coins = 'coinsNo';
tail = '112916.csv';

到目前为止,我已经创建了一个脚本,它将保存包含'Yes'的所有变量,但是当我运行脚本/调试模式时,与在控制台中手动测试相比,我得不到一致的结果。

>> edit cashname

filename = 'paidYes_cashYes_cardNo_billsYes_coinsYes_112916.csv';
namearray = strsplit(filename,'_'); % Splits string into a 1x6 cell

i = 1;
for n = namearray{i} % 'Yes' containing variables only!
       if strfind(n,'paidYes') > 0
           paid = 'paidYes';
       elseif strfind(n,'cashYes') > 0
           cash = 'cashYes';
       elseif strfind(n,'cardYes') > 0
           card = 'cardYes';
       elseif strfind(n,'billsYes') > 0
           bills = 'billsYes';
       elseif strfind(n,'coinsYes') > 0
           coins = 'coinsYes';
       end
i = i + 1
end

当我执行脚本时,我发现n被分配了字符串的第一个字母! ni的结果如果未被抑制则低于以下结果:

>> cashname
n = p
i = 2
n = a
i = 3
n = i
i = 4
n = d
i = 5
n = Y
i = 6
n = e
i = 7
n = s
i = 8

但是,当我在调试模式或控制台中输入命令时,我会输出完整的字符串:

>> length(namearray)
     ans = 6
>> i = 2;
>> n = namearray{i}
     n = 
     cashYes

我是否发现了某种错误,我在语法错误方面做了什么,我该如何解决?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

namearray的每个元素都包含分隔数据作为char数组。当你写作时,

i = 1;
for n = namearray{i}

MATLAB将其解释为

for n = 'paidYes'

并且因为" for语句会覆盖对循环中的索引所做的任何更改" [src],索引n将在char数组的元素上运行,这是期望和看到的。

除了使用switch声明以外,我建议的两个备选方案是直接迭代namearray的元素

for n = namearray
    switch n{1}
        case 'paidYes'
            paid = 'paidYes';
        case 'cashYes'
            cash = 'cashYes';
        case 'cardYes'
            card = 'cardYes';
        case 'billsYes'
            bills = 'billsYes';
        case 'coinsYes'
            coins = 'coinsYes';
    end
end

或使用整数for - 循环索引来访问namearray元素

for n = 1:length(namearray)
    switch namearray{k}
        case 'paidYes'
            paid = 'paidYes';
        case 'cashYes'
            cash = 'cashYes';
        case 'cardYes'
            card = 'cardYes';
        case 'billsYes'
            bills = 'billsYes';
        case 'coinsYes'
            coins = 'coinsYes';
    end
end