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