Matlab:关于数组的代码有问题

时间:2013-03-14 21:22:17

标签: matlab

以下是问题:

文件upcs.txt包含在杂货店扫描的UPC代码列表 商店。理想情况下,每一行应包含对应于单个产品的12位数字。读 文件的内容并将条目存储到名为的m x 12大小的数字数组中 代码,其中m是文件中有效行的数量。具有少于或多于的行 应丢弃12位数字。一些12位数的行可能有不正确的数字 正确扫描,被字母X'. These missing digits should be represented in the array codes by the integer - 1'取代。处理完文件后,打印总数 读取的行数,丢弃的行数和正确的行数 处理并存储在代码中。

upcs.txt:

X9096X082489

921642004330

810905023006

733554287763

413527622XX1

287X35871528

100093334850

764491079X90

1537X8886614

086755751640

860053705316

980098819206

038356338621

577577248178

82825685985

684580785580

736657539753

71113617151

935014271064

702345843488

58316491755

110118383664

333841856254

996003013296

495258095746

4457870230

684104168936

522784039910

6504512835

699553963094

853110488363

554147120089


到目前为止,这是我的代码:

fid = fopen('upcs.txt');
mat = [];
if fid == -1
    disp('File open was not successful')
else codes = {};
    while feof(fid) == 0
        aline = fgetl(fid);
        num = strtok(aline);
        codes = [codes; num]
    end;
[m n] = size(codes)
discard = 0
for i = 1:m
    len = length (codes(i))
    if len ~= 12
        codes = [];
        discard = discard + 1
    else
        char(codes(i))
        codes = strrep(codes, 'X', '-1')
    end
end
codes
end

我遇到的麻烦是我不知道如何删除代码中少于或多于12位的代码。

1 个答案:

答案 0 :(得分:1)

clear;clc;
fid = fopen('upcs.txt','r');
if fid == -1
    error('File open was not successful');    
end

C = textscan(fid,'%s');
C = C{1};

all_codes_num = size(C,1);
codes_discarded_num = 0;
codes_missed_digit_num = 0;
codes_correct_num = 0;
codes = [];
for i = 1:all_codes_num
    one_code = C{i};
    if length(one_code) == 12
        x_flag = 0;
        code_tmp = zeros(1,12);
        for j = 1:12
            if one_code(j) == 'X' || one_code(j) == 'x'
                code_tmp(j) = -1;
                x_flag = 1;
            else 
                code_tmp(j) = str2num(one_code(j));
            end
        end
        if x_flag == 1
            codes_missed_digit_num = codes_missed_digit_num +1;
        end
        codes = [codes;code_tmp];
    elseif length(one_code) ~= 12
        codes_discarded_num = codes_discarded_num + 1;
    end
end

all_codes_num
codes_discarded_num
codes_with_x = codes_missed_digit_num
correct_codes_without_x = all_codes_num - codes_discarded_num - codes_with_x

代码:具有所有正确的代码以及缺少数据的12长度代码,这些代码已被替换为“-1”。这是一个m * 12数字矩阵。每行都是一个代码。

all_codes_num:我们读过的所有行的数量

codes_discarded_num:所有代码的数量多于或少于12个字符

codes_with_x:缺少数字的12长度代码的数量。

correct_codes_without_x:仅包含数字的12长度代码的数量。

在代码中,我假设在'upcs.txt'中,每一行都是一个代码。