date and time string identification

2 views (last 30 days)
Jorge Luis Paredes Estacio
Edited: Stephen23 on 19 Dec 2022
Hello, I have the following information obtained from a text-file
date_hne: {'2014' '04' '01' '23' '46' '44.998300'}
date_hnn: {'2014' '04' '01' '23' '46' '44.998300'}
date_hnz: {'2014' '04' '01' '23' '46' '44.998300'}
as output in a cell array. I need to convert this information into a date vector that identify the date and time using the following command
formatIn = 'yyyy-MM-dd HH:mm:ss.SSS'
date_hne = datestr(date_hne,formatIn)
date_hnn = datestr(date_hnn,formatIn)
date_hnz = datestr(date_hnz,formatIn)
The seconds can be rounded as 45
The readable file is an compressed file (wwith 3 files) in order to be read. I can not attached the file that is why I attached as an uncompressed file here.
The script is as follows
%% Sub-function 5: this works for the data from the CENTRO SISMOLOGICO NACIONAL (CSN) OF CHILE
function [date_hne, date_hnn, date_hnz] = import_zip_chile (filename)
mkdir('tmp')
if strcmp(filename(end-2:end),'zip')==1
unzip(filename,'tmp');
else
error('Not a Zip');
end
cd('tmp')
content=dir;
content(1:2,:)=[];
cd ..
fname = content(1).name;
fname = fname(1:end-8);
formatIn = 'yyyy-MM-dd HH:mm:ss.SSS'
% S = dir(fullfile(path,[file_name,'*.txt']));
index_station = 0; %index added for stations
%% create list of unique filenames like 20211104-041752-C16O
% list of unique files :
% load "HNE"
try
file_name_1 = [fname, '-HNE.txt'];
file_name_1 = strrep(file_name_1,'_','-');
[header_hne] = import_from_CSN_chile(['tmp\',file_name_1],1);
catch
file_name_1 = [fname, '-HLE.txt'];
file_name_1 = strrep(file_name_1,'_','-');
[header_hne] = import_from_CSN_chile(['tmp\',file_name_1],1);
end
number_of_rows_header = min(size(header_hne));
for i=1:number_of_rows_header
if strcmp(header_hne(i,1:length('# Tiempo de Origen:')),'# Tiempo de Origen:')==1
line_date = i;
end
end
date_hne = regexp(header_hne(line_date,:),'-?\d+\.?\d*|-?\d*\.?\d+','match'); % date and time
%date_hne = join(date_hne);
date_hne = date_hne(~isspace(date_hne));
date_hne = erase(date_hne,"-"); %erase dash fromt the string
date_hne = datestr(date_hne); %added to convert to date string
% load "HNN"
try
file_name_2 = [fname, '-HNN.txt'];
file_name_2 = strrep(file_name_2,'_','-');
[header_hnn] = import_from_CSN_chile(['tmp\',file_name_2],1);
catch
file_name_2 = [fname, '-HLN.txt'];
file_name_2 = strrep(file_name_2,'_','-');
[header_hnn] = import_from_CSN_chile(['tmp\',file_name_2],1);
end
date_hnn = regexp(header_hnn(line_date,:),'-?\d+\.?\d*|-?\d*\.?\d+','match'); % date and time
%date_hnn = join(date_hnn);
date_hnn = date_hnn(~isspace(date_hnn));
date_hnn = erase(date_hnn,"-"); %erase dash fromt the string
date_hnn = datestr(date_hnn); %added to convert to date string
% load "HNZ"
try
file_name_3 = [fname, '-HNZ.txt'];
file_name_3 = strrep(file_name_3,'_','-');
[header_hnz] = import_from_CSN_chile(['tmp\',file_name_3],1);
catch
file_name_3 = [fname, '-HLZ.txt'];
file_name_3 = strrep(file_name_3,'_','-');
[header_hnz] = import_from_CSN_chile(['tmp\',file_name_3],1);
end
date_hnz = regexp(header_hnz(line_date,:),'-?\d+\.?\d*|-?\d*\.?\d+','match'); % date and time
%date_hnz = join(date_hnz);
date_hnz = date_hnz(~isspace(date_hnz));
date_hnz = erase(date_hnz,"-"); %erase dash fromt the string
date_hnz = datestr(date_hnz); %added to convert to date string
rmdir ('tmp','s')
end
%%function to import from chile
function [head] = import_from_CSN_chile(filename,nclm,skip,formt)
% READCLM Reads numerical data from a text file into a matrix.
% Text file can begin with a header or comment block.
% [DATA,HEAD] = READCLM(FILENAME,NCLM,SKIP,FORMAT)
% Opens file FILENAME, skips first several lines specified
% by SKIP number or beginning with comment '%'.
% Then reads next several lines into a string matrix HEAD
% until the first line with numerical data is encountered
% (that is until first non-empty output of SSCANF).
% Then reads the rest of the file into a numerical matrix
% DATA in a format FORMAT with number of columns equal
% to number of columns of the text file or specified by
% number NCLM. If data does not match the size of the
% matrix DATA, it is padded with NaN at the end.
%
% READCLM(FILENAME) reads data from a text file FILENAME,
% skipping only commented lines. It determines number of
% columns by the length of the first data line and uses
% the floating point format '%g';
%
% READCLM uses FGETS to read the first lines and FSCANF
% for reading data.
% Defaults and parameters ..............................
formt_dflt = '%g'; % Default format for fscanf
addn = nan; % Number to fill the end if necessary
% Handle input ..........................................
if nargin<1, error(' File name is undefined'); end
if nargin<4, formt = formt_dflt; end
if nargin<3, skip = 0; end
if nargin<2, nclm = 0; end
if isempty(nclm), nclm = 0; end
if isempty(skip), skip = 0; end
% Open file ............................
[fid,msg] = fopen(filename);
if fid<0, disp(msg), return, end
% Find header and first data line ......................
is_head = 1;
jl = 0;
head = ' ';
while is_head % Add lines to header.....
s = fgets(fid); % Get next line
jl = jl+1;
is_skip = jl<=skip;
is_skip = jl<=skip | s(1)=='%';
out1 = sscanf(s,formt); % Try to read this line
% If unreadable by SSCANF or skip, add to header
is_head = isempty(out1) | is_skip;
if is_head & ~is_skip
head = str2mat(head,s(1:length(s)-1)); end
end
head = head(2:size(head,1),:);
% Determine number of columns if not specified
out1 = out1(:)';
l1 = length(out1);
if ~nclm, nclm = l1; end
fclose (fid); % Close file ..........
end
  1 Comment
Stephen23
Stephen23 on 19 Dec 2022
Edited: Stephen23 on 19 Dec 2022
It is unclear what your actual question is.
This is very smelly code:
cd('tmp')
content=dir;
content(1:2,:)=[];
cd ..
Do not use CD just to access data files or call DIR. Using CD is slow and makes debugging harder. You should use absolute/relative filepaths.
Deleting elements 1 & 2 from the structure returned by DIR() is a buggy way to handle the dot directory names:
As Walter Roberson wrote in that last link: "In short: if your code assumes that '.' and '..' are the first two entries in a directory, your code has a bug (even in MS Windows). If your code assumes that directory entries are returned in any sorted order, your code has a bug (in all OS.)"
The robust approach is one of these:
  • use ISMEMBER, SETDIFF, or similar on the names.
  • specify the DIR() match string to exclude dot directory names.

Sign in to comment.

Answers (1)

Peter Perkins
Peter Perkins on 19 Dec 2022
Edited: Peter Perkins on 19 Dec 2022
"I have the following information obtained from a text-file
date_hne: {'2014' '04' '01' '23' '46' '44.998300'}"
I don't see anything even remotely like that in the three text files you've attached. And that's not a great format to end up with. post more information on how you got there, and people can probably help.
Also: these two things
formatIn = 'yyyy-MM-dd HH:mm:ss.SSS'
date_hne = datestr(date_hne,formatIn)
are incompatible. The first is a datetime format. The second is a call to the legacy datestr function, which uses a very different set of formats. Don't use datestr.

Categories

Find more on Structures in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!