我正在尝试计算文本文件中的字母数,但不幸的是,如果涉及到数字,我会一直卡住。
到目前为止,我已经能够处理字母和符号,但不幸的是,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;
如果文本文件中还有数字,我如何处理计数字母?
答案 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
两次,以避免使用从90
到97
的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