получение информации о содержимом текстового файла в Matlab - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть файл .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

Только значения 'time' и 'file' являются числами, а остальные являются строками.

Я хочу хранить значения «правильное», «время», «предположение», «действие» и «файл» целых 300 строк в различных переменных (например, в некоторых массивах).

Как я могу сделать это в Matlab?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Опция 1:

Вы можете использовать textscan со следующими formatSpec :

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

, где fileID - этоидентификатор файла, полученный с помощью fopen.

Опция 2:

Другой вариант - использовать readtable с форматированием, указанным выше (напрямуюс именем файла, без идентификатора файла):

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 состоит в том, что таблица намного удобнее хранить эти данные, чем массив ячеек (который является выходом textscan).

0 голосов
/ 26 ноября 2018

Используйте 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);

Пример:

Предположим, файл .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...