У меня есть 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);
Что я пробовал
-
Я думаю, мне нужно использовать findstr. Но я мог бы закодировать его только тогда, когда я использую оператор if. Таким образом, код был слишком медленным.
-
Вместо этого, используя 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);
Хорошо, я дам вам решение. Что вы можете сделать, это использовать 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);
Некоторые заметки для вас:
-
В первый раз, когда я вызываю
regexp
(хранение вspacesGone
), мы ищем любые экземпляры, где они разделены хотя бы одним пространством и разделяются на основе этого. Вот почему есть оператор+
, поскольку мы ищем хотя бы одно пространство. -
Второй вызов
regexp
(сохранение вsplitDates
), чтобы указать поиск периода, нам нужно сделать\.
, as.
обозначает подстановочный знак, и это не то, что мы хотим.