如何将有理数字符串转换为文本文件中的数字,该文本文件中列出了带有名称和时间的音符。
例如;
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。如何获得这些数据,第一个是字符串,第二个是有理数?
我认为问题是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
另一种需要考虑的方法(较低级别的文件操作)
如果您有一个文件music.txt
,它是csv:
Note, Timing
La, 1/8
Si, 1/4
您可以将其读取到Matlab表中,并使用将时间列转换为双精度
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