formatting text file using matlab

4 次查看(过去 30 天)
Dung Tran
Dung Tran 2022-10-19
评论: Mathieu NOE 2022-10-21
Hi everyone, I have a text file with input data as below :
Here Is The Internal calendar ==> Year 2022/09/30 ::::WeekDay : 06
==> Time 15:21:06
****** Waiting for a Command to Start......******
Received a Command....
-17 -17 -11 -21 -13 -20 -11 -23 0000001
22 21 28 18 27 19 27 16 0000002
22 21 27 18 27 18 27 15 0000003
22 21 28 18 27 19 27 15 0000004
I want to re-format the text file with input above into a new text file with format as below
09/30/2022 03:33:16 PM -23 -11 -20 -13 -21 -11 -17 -17
09/30/2022 03:33:18 PM 16 27 19 27 18 28 21 22
09/30/2022 03:33:20 PM 15 27 18 27 18 27 21 22
09/30/2022 03:33:22 PM 15 27 19 27 18 28 21 22
Can anyone please show me how to do it ? thank you very much.
in case I have 20 text files like that, how can I read and re-format all 20 text file at 1 time code run ?

回答(2 个)

Mathieu NOE
Mathieu NOE 2022-10-19
编辑:Mathieu NOE 2022-10-19
hello
let's start with one file ... then we will add the for loop to process many files in one operation
there is still one point which is not clear from me , is where to find the time increment between the four lines of data
we can see the time has incremented by 2 seconds between each successive line , but that increment is not something I could extract from the original data file. So for the time being it's hard coded.
the original data I saved it in a file : 'data001.txt'
fileDir = pwd; % choose your working directory
filename = 'data001.txt'; % filenames
out = do_the_job(fileDir, filename)
%%%%%%%%%%%% function %%%%%%%%%%%%%%%
function out = do_the_job(fileDir,filename)
D=readlines(fullfile(fileDir,filename)); % read as string array
nb_lines = numel(D);
% find date and put into format MM/DD/YY
ixP1=find(contains(D,'==> Year ')); % find the Year line
new_dat = strtrim(extractBetween(D(ixP1),'==> Year ','::::WeekDay'));
new_dat = split(new_dat,'/');
new_dat = [new_dat(2) new_dat(3) new_dat(1)];
new_dat = join(new_dat,'/');
% find time and put in new format
ixP2=find(contains(D,'==> Time')); % find the Time line
time = strtrim(extractAfter(D(ixP2),'==> Time'));
time = split(time,':');
hours = str2double(time(1));
if hours > 12
str = "PM ";
hours = hours -12;
else
str = "AM ";
end
% extract data array and reformat
ixP3=find(contains(D,'Received a Command')); % find the Received a Command line
data=str2double(split(strtrim(D(ixP3+1:nb_lines))));
data=data(:,1:end-1); % remove last column
data=data(:,end:-1:1); % flip columns (left right)
[md,nd] = size(data);
data_str = string(data);
% increment time lines by dt = 2 seconds per data line
for ck = 1:md
secs = str2double(time(3))+(ck-1)*2; % increment time lines by dt = 2 seconds per data line
secs_str = num2str(secs);
if secs<10
secs_str = strcat("0",secs_str);
end
time_out = [num2str(hours) time(2) secs_str];
time_out = join(time_out,':');
time_out = [time_out str];
time_out = join(time_out,' ');
% combine date and time strings
tmp = [new_dat time_out];
dat_and_time{ck,1} = join(tmp,' ');
end
% final assembly
out = join([dat_and_time data_str],' ');
% save to txt file
filename_out = ['out_' filename(1:length(filename)-4) '.txt'];
fid = fopen(fullfile(fileDir, filename_out), 'w' ); %// open file to writing
fprintf( fid, '%s\n', out ); %// print string to file
fclose( fid ); %// don't forget to close the file
disp(['File :' filename_out ' has been saved.']);
end
  1 个评论
Mathieu NOE
Mathieu NOE 2022-10-19
this is now the version that works for a complete folder with multiple files
hope it helps
NB : make sure you have installed that FEX submission (natsortfiles) that allows to sort files better than what matlab does by default
fileDir = pwd; % choose your working directory
S = dir(fullfile(fileDir,'data0*.txt')); % get list of data files in directory
S = natsortfiles(S); % sort file names into natural order , see :
%(https://fr.mathworks.com/matlabcentral/fileexchange/47434-natural-order-filename-sort)
for k = 1:length(S)
out = do_the_job(fileDir, S(k).name)
end
%%%%%%%%%%%% function %%%%%%%%%%%%%%%
function out = do_the_job(fileDir,filename)
D=readlines(fullfile(fileDir,filename)); % read as string array
nb_lines = numel(D);
% find date and put into format MM/DD/YY
ixP1=find(contains(D,'==> Year ')); % find the Year line
new_dat = strtrim(extractBetween(D(ixP1),'==> Year ','::::WeekDay'));
new_dat = split(new_dat,'/');
new_dat = [new_dat(2) new_dat(3) new_dat(1)];
new_dat = join(new_dat,'/');
% find time and put in new format
ixP2=find(contains(D,'==> Time')); % find the Time line
time = strtrim(extractAfter(D(ixP2),'==> Time'));
time = split(time,':');
hours = str2double(time(1));
if hours > 12
str = "PM ";
hours = hours -12;
else
str = "AM ";
end
% extract data array and reformat
ixP3=find(contains(D,'Received a Command')); % find the Received a Command line
data=str2double(split(strtrim(D(ixP3+1:nb_lines))));
data=data(:,1:end-1); % remove last column
data=data(:,end:-1:1); % flip columns (left right)
[md,nd] = size(data);
data_str = string(data);
% increment time lines by dt = 2 seconds per data line
for ck = 1:md
secs = str2double(time(3))+(ck-1)*2; % increment time lines by dt = 2 seconds per data line
secs_str = num2str(secs);
if secs<10
secs_str = strcat("0",secs_str);
end
time_out = [num2str(hours) time(2) secs_str];
time_out = join(time_out,':');
time_out = [time_out str];
time_out = join(time_out,' ');
% combine date and time strings
tmp = [new_dat time_out];
dat_and_time{ck,1} = join(tmp,' ');
end
% final assembly
out = join([dat_and_time data_str],' ');
% save to txt file
filename_out = ['out_' filename(1:length(filename)-4) '.txt'];
fid = fopen(fullfile(fileDir, filename_out), 'w' ); %// open file to writing
fprintf( fid, '%s\n', out ); %// print string to file
fclose( fid ); %// don't forget to close the file
disp(['File :' filename_out ' has been saved.']);
end

请先登录,再进行评论。


Dung Tran
Dung Tran 2022-10-19
Hi Mathieu, that is a great help ! thank you very much.
The test is 2 second sampling rates so that is why each line is 2s apart.
But looklike have an error on date and time as you can see below. I hope you can help to fix this issue .
Also I will need to remove the last Row of the original text file because when I run the code got an error with delimiters since the last row is always not the same element columm with the previous row.
hope you can help on both of these error. Thank you Mathieu
  2 个评论
Dung Tran
Dung Tran 2022-10-19
the date and time should go to the next date and time since it is 2 second increment
Mathieu NOE
Mathieu NOE 2022-10-21
hello Dung
ok I see the issue
to make sure I solved it can you share one (or several ) original files ?
tx

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Dates and Time 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by