在Matlab中检索文本文件内容信息

时间:2018-11-26 17:12:38

标签: matlab

我有一个.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中做到这一点?

2 个答案:

答案 0 :(得分:3)

选项1:

您可以将textscan与以下formatSpec结合使用:

formatSpec = 'ANSWER: correct:%s time:%f guess:%s action:%s file: %f';
data = textscan(fileID,formatSpec,'Delimiter',',');

其中fileIDfopen获得的文件标识符。

选项2:

另一种选择是使用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