阅读文本文件和处理数字

时间:2015-05-26 20:56:48

标签: matlab for-loop text binary

我正在尝试计算文本文件中的字母数,但不幸的是,如果涉及到数字,我会一直卡住。

到目前为止,我已经能够处理字母和符号,但不幸的是,ischar函数在数字方面对我没有帮助。

function ok = lets(file_name)
fid = fopen(file_name, 'rt');
if fid < 0
    ok = -1;
end
C = [];
D = [];
oneline = fgets(fid);

while ischar(oneline)
    C = oneline(isletter(oneline));
    W = length(C);
    D = [D ; W];
    oneline = fgets(fid);
end
total = 0;
for i = 1:length(D)
    total = D(i) + total;
end
ok = total; 

如果文本文件中还有数字,我如何处理计数字母?

2 个答案:

答案 0 :(得分:1)

我认为你的收集比它需要的要多得多,只需像你一样使用isletter,然后使用length

function ok = lets(file_name)
%Original code as you had it
fid = fopen(file_name, 'rt');
if fid < 0
    ok = -1;
 end
%Initialize length
ok = 0;
%Get first line
oneline = fgets(fid);

%While line isn't empty
while oneline ~= -1
    %remove everythin that's not a letter
    oneline(~isletter(oneline)) = [];
    %Add number of letters to output
    ok = ok + length(oneline);
    %Get next line
    oneline = fgets(fid);
end
end

我使用了输入文件

Ar,TF,760,2.5e-07,1273.14,4.785688323049946e+24,24.80738364864047,37272905351.7263,37933372595.0276
Ar,TF,760,5e-07,1273.14,4.785688323049946e+24,40.3092219226107,2791140681.70926,2978668073.513113
Ar,TF,760,7.5e-07,1273.14,4.785688323049946e+24,54.80989010679312,738684259.1671219,836079550.0157251

得到18,这会计算数字中的e,你想要计算这些吗?

答案 1 :(得分:1)

我通过以下方式解决了这个问题:

function ok = lets(file_name)

file    = memmapfile( file_name, 'writable', false );
lowercase = [65:90];
uppercase = [97:122];
data = file.Data;
ok = sum(histc(data,lowercase)+histc(data,uppercase));

end

我使用memmapfile函数将文件映射到内存,并将数据与this ASCII table中的字符编码进行比较。小写字母由[65:90]表示,大写字母由[97:122]表示。通过应用histc函数,我得到了每个字母出现在文件中的频率。通过将所有频率相加来给出字母总数。

请注意,我拨打了histc两次,以避免使用从9097的bin,这会计算[] ^ _`字符。

我将该函数应用于名为 sample.txt 的示例文件,其中包含以下行:

abc23D&f![
k154&¨&skj
djaljaljds

这是我的输出:

>> lets('sample.txt')
Elapsed time is 0.017783 seconds.

ans =

    19

修改

输出ok=-1以解决阅读文件的问题:

function ok = lets(fclose(fid);file_name)
try
    file    = memmapfile( file_name, 'writable', false );
catch
    file=[];
    ok=-1;
end
if ~isempty(file)
    lowercase = [65:90];
    uppercase = [97:122];
    data = file.Data;
    ok = sum(histc(data,lowercase)+histc(data,uppercase));
end

end

采用fopen方式,因为您默认获得ok=-1&#34;&#34;:

function ok = lets(file_name)
fid = fopen(file_name, 'rt');
if fid < 0
    ok = -1;
else
    celldata=textscan(fid,'%s');
    fclose(fid);
    lowercase = [65:90];
    uppercase = [97:122];
    data = uint8([celldata{1}{:});
    ok = sum(histc(data,lowercase)+histc(data,uppercase));
end

end