如何将有理数字符串转换为具有名称和时间列出的音符的文本文件中的数字。
例如;
La,1/8
La,1/8
La,1/8
La,1/8
Si,1/4
将文件读入Matlab并逐一获取。
fid=fopen('file.txt');
while 1
tline = fgetl(fid);
if ~ischar(tline), break, end
%disp(tline)
split = strsplit(tline,',');
note=split(1);
timing=str2num(split(2));
end
fclose(fid);
我可以得到第一个数据,即音符作为字符串。问题是时间部分。 str2num可以将字符串转换为数字,但是当它是上面示例中的有理数时,它会返回NaN。 如何获取这些数据,第一个作为字符串,第二个作为有理数?
答案 0 :(得分:3)
我认为问题是strsplit
会返回字符串的单元格数组:
>> tline = 'La,1/8'; %// example line
>> split = strsplit(tline,',')
split =
'La' '1/8'
并且您无法在单元格上应用str2num
:
>> str2num(split(2))
Error using str2num (line 32)
Requires string or character array input.
但你可以将它应用于单元格的内容,这是一个字符串:
>> str2num(split{2})
ans =
0.125000000000000
答案 1 :(得分:1)
如果您的文件music.txt
是csv:
Note, Timing
La, 1/8
Si, 1/4
您可以将其读入Matlab table并将您的时间列转换为双精度符号:
t = readtable('music.txt');
t.TimeNum = cellfun(@str2num, t.Timing); % Apply str2num to each entry
% of t.Timing cell array
然后您的表格t
将是:
Note Timing TimeNum
____ ______ _____
'La' '1/8' 0.125
'Si' '1/4' 0.25