0

質問は次のとおりです。

ファイル upcs.txt には、食料品店でスキャンされた UPC コードのリストが含まれています。各行には、理想的には、1 つの製品に対応する 12 桁が含まれている必要があります。ファイルの内容を読み取り、codes という名前の mx 12 サイズの数値配列にエントリを格納します。ここで、m はファイル内の有効な行の数です。12 桁未満または 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 桁以下または 12 桁以下のコードを削除する方法がわからないことです。

4

1 に答える 1

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

コード: すべての正しいコードと、'-1' に置き換えられた欠損データを含む 12 の長さのコードがあります。これは am*12 数値行列です。各行はコードです。

all_codes_num: 読み取ったすべての行の数

code_discarded_num: 12 文字より多いまたは少ないすべてのコードの数

code_with_x: 桁が欠落している 12 の長さのコードの数。

correct_codes_without_x: 数字のみを持つ 12 の長さのコードの数。

コードでは、「upcs.txt」の各行がコードであると想定しています。

于 2013-03-14T21:50:47.427 に答える