Использование MatLab для получения строк, у третьих столбцов которых есть определенная строка

Вопрос:

У меня есть txt файл с разделителями табуляции.

Это выглядит как

3   5    2011-05-30.01:22:02.558151+00
1   3    2014-01-10.16:25:20.992213+00

Третья колонка – это столбец даты. Я хочу получить строки, даты которых 2011-05-30 или 2011-05-31 или 2011-06-01 или 2011-06-02.

Я начинаю код с

fid = fopen('input.txt');
input = textscan(fid, '%f %f %*s','delimiter','\t','HeaderLines',0);

Что я пробовал

  1. Я думаю, мне нужно использовать findstr. Но я мог бы закодировать его только тогда, когда я использую оператор if. Таким образом, код был слишком медленным.

  2. Вместо этого, используя python, я просто заменил “-” ничем, а затем удалил вещи после “даты”.

Например, я изменил

2011-05-17.01:22:02.558151+00

в

20110517

Тогда input.txt целиком состоит только из числа, а не строки.

Таким образом, в MatLab легко манипулировать.

Поэтому я импортировал исправленный файл input.txt в MatLab.

Затем я выбрал строку с третьим столбцом: 20110517 или 20110518.

Но это решение утомительно.

Я попробовал следующее решение, но не работал.

%// Read in the text file
textArray = textread('input.txt', '%s', 'delimiter', '\n');

%// Space split
spacesGone = cellfun(@(x) regexp(x, ' ', 'split'), textArray, 'uni', false);

%// Extract only the dates
thirdColumn = cellfun(@(x) x{3}, spacesGone);

%// Get only the date now, not the time
splitDates = cellfun(@(x) regexp(x, ' ', 'split'), thirdColumn, 'uni', false);
datesFinal = cellfun(@(x) x{1}, splitDates, 'uni', false);

%// Convert to datenum format
dateNums = datenum(datesFinal);

%// Filter
validDates = dateNums >= 734653 & dateNums <= 734656;

%// Get final dates
finalDates = textArray(validDates);

Ответ №1

Хорошо, я дам вам решение. Что вы можете сделать, это использовать textread для чтения в текстовом файле. То, что мы сделаем, будет прочитано в тексте, и каждая строка будет помещена в одну ячейку. Для каждой ячейки мы выделяем строку пробелами. Как только мы это сделаем, мы увидим, что каждый 3 элемента в тексте – это то, что вы хотите.

Таким образом, мы также будем подмножать массив ячеек, чтобы мы отбирали каждые 3 элемента. Как только мы это сделаем, мы разделим строку на основе . вынести только саму дату. Затем мы используем datenum для преобразования даты в число. При использовании datenum, 2011-05-30 или 2011-05-31 или 2011-06-01 или 2011-06-02 соответствуют 734653 – 734656. Поэтому мы конвертируем каждую из дат в эти числа, затем выясняем, какие даты попадают в этот диапазон. Затем мы можем подмножить исходный массив текстовых ячеек и продолжить. Другими словами, если ваш текстовый файл называется text.txt, выполните следующие действия:

%// Read in the text file
textArray = textread('text.txt', '%s', 'delimiter', '\n');

%// Space split
spacesGone = cellfun(@(x) strsplit(x), textArray, 'uni', false);

%// Extract only the dates
thirdColumn = cellfun(@(x) x{3}, spacesGone, 'uni', false);

%// Get only the date now, not the time
splitDates = cellfun(@(x) strsplit(x, '.'), thirdColumn, 'uni', false);
datesFinal = cellfun(@(x) x{1}, splitDates, 'uni', false);

%// Convert to datenum format
dateNums = datenum(datesFinal);

%// Filter
validDates = dateNums >= 734653 & dateNums <= 734656;

%// Get final dates
finalDates = textArray(validDates);

Используя приведенный выше пример, мы получаем:

finalDates =

'3    2    2011-05-30.01:22:02.558151+00'

Незначительное примечание

strsplit работает только для MATLAB R2013a и выше. Если у вас этого нет, попробуйте вместо него использовать regexp. Таким образом, замените strsplit на regexp. Таким образом, это будет выглядеть ваш код:

%// Read in the text file
textArray = textread('text.txt', '%s', 'delimiter', '\n');

%// Space split
spacesGone = cellfun(@(x) regexp(x, ' +', 'split'), textArray, 'uni', false);

%// Extract only the dates
thirdColumn = cellfun(@(x) x{3}, spacesGone, 'uni', false);

%// Get only the date now, not the time
splitDates = cellfun(@(x) regexp(x, '\.', 'split'), thirdColumn, 'uni', false);
datesFinal = cellfun(@(x) x{1}, splitDates, 'uni', false);

%// Convert to datenum format
dateNums = datenum(datesFinal);

%// Filter
validDates = dateNums >= 734653 & dateNums <= 734656;

%// Get final dates
finalDates = textArray(validDates);

Некоторые заметки для вас:

  1. В первый раз, когда я вызываю regexp (хранение в spacesGone), мы ищем любые экземпляры, где они разделены хотя бы одним пространством и разделяются на основе этого. Вот почему есть оператор +, поскольку мы ищем хотя бы одно пространство.

  2. Второй вызов regexp (сохранение в splitDates), чтобы указать поиск периода, нам нужно сделать \. , as . обозначает подстановочный знак, и это не то, что мы хотим.

Оцените статью
TechArks.Ru
Добавить комментарий