我有一个.txt文件,其中包含300行。例如,第一行是:
ANSWER: correct: yes, time: 6.880674, guess: Lay, action: Lay, file: 16
或第二行是:
ANSWER: correct: no, time: 7.150422, guess: Put on top, action: Stir, file: 18
只有“时间”和“文件”值是数字,其他是字符串。
我想将整行的300行的“正确”,“时间”,“猜测”,“动作”和“文件”的值存储在不同的变量(如某些数组)中。
如何在Matlab中做到这一点?
答案 0 :(得分:3)
您可以将textscan
与以下formatSpec结合使用:
formatSpec = 'ANSWER: correct:%s time:%f guess:%s action:%s file: %f';
data = textscan(fileID,formatSpec,'Delimiter',',');
其中fileID
是fopen
获得的文件标识符。
另一种选择是使用readtable
,具有上面的格式(直接使用文件名,没有文件ID):
data = readtable('53485991.txt','Format',formatSpec,'Delimiter',',',...
'ReadVariableNames',false);
% the next lines are just to give the table variables some meaningful names:
varNames = strsplit(fmt,{'ANSWER',':','%s',' ','%f'});
data.Properties.VariableNames = varNames(2:end-1);
结果(忽略这些值,因为我在玩该示例时将其弄乱了一点)
data =
4×5 table
correct time guess action file
_______ ______ _______________ ______ ____
'yes' 6.8888 'Lay' 'Lay' 16
'no' 7.8762 'Put on top' 'Stir' 18
'no' 7.1503 'Put on bottom' 'Stir' 3
'no' 7.151 'go' 'Stir' 270
选项2的优点在于,表是a much more convenient way来保存这些数据,而不是单元格数组(这是textscan
的输出)。
答案 1 :(得分:1)
使用fgetl
获取文件的一行,并使用while
循环读取所有行。
对于每一行,使用regexp
通过:
和,
分隔符将字符串划分为单元格。然后,使用strip
删除每个单元格的前导和尾随空格。
这是解决方案:
f = fopen('a.txt');
aline = fgetl(f);
i = 1;
while ischar(aline)
content = strip(regexp(aline,':|,','split'));
correct{i} = content{3};
time(i) = str2double(content{5});
guess{i}= content{7};
action{i} = content{9};
file(i) = str2double(content{11});
i = i + 1;
aline = fgetl(f);
end
fclose(f);
示例:
假设a.txt文件如下所示
ANSWER: correct: yes, time: 6.880674, guess: Lay, action: Lay, file: 16
ANSWER: correct: no, time: 7.150422, guess: Put on top, action: Stir, file: 18
执行脚本后,结果为
correct =
1×2 cell array
'yes' 'no'
time =
6.8807 7.1504
guess =
1×2 cell array
'Lay' 'Put on top'
action =
1×2 cell array
'Lay' 'Stir'
file =
16 18