How to import odd and even rows from a more than one txt file ?
3 ビュー (過去 30 日間)
古いコメントを表示
Hello;
I have 20 different txt files and the content of each of them is similar to the one I have stated below. I need to save the numbers in the odd rows of the 1st column as 'A' and the numbers in the even rows of the 3rd column as 'B'; but after the 150th row, the text part starts and I should not include this part.
Can you help me?
Thank you
txt file:
x y z
1 2 3
4 5
6 7 8
9 10
.
.
.
.
The explanation part starts after line 150th row.
0 件のコメント
採用された回答
Mathieu NOE
2022 年 12 月 6 日
編集済み: Mathieu NOE
2022 年 12 月 6 日
hello
maybe this ?
I wasn't sure when you say even / odd rows if we take the first line (x y z) into account or not
so choose your option in the code
clc
clearvars
fileDir = pwd; % choose your working directory
start_line = 2;
stop_line = 150;
S = dir(fullfile(fileDir,'data*.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)
[A,B] = do_the_job(fileDir, S(k).name,start_line,stop_line)
end
%%%%%%%%%%%% function %%%%%%%%%%%%%%%
function [A,B] = do_the_job(fileDir,filename,start_line,stop_line)
D=readlines(fullfile(fileDir,filename)); % read as string array
D= D(start_line:stop_line,:);
% remove empty string
D(D == '') = [];
D = str2double(split(D,' '));
[m,n] = size(D);
% I need to save the numbers in the odd rows of the 1st column as 'A'
% and the numbers in the even rows of the 3rd column as 'B';
% % option 1 : "odd / even" rows without taking the first line (headerline)
% % in account
% A = D((1:2:m),1); % odd rows of the 1st column as 'A'
% B = D((2:2:m),3); % even rows of the 3rd column as 'B';
% option 2 : "odd / even" rows with taking the first line (headerline)
% in account
A = D((2:2:m),1); % odd rows of the 1st column as 'A'
B = D((1:2:m),3); % even rows of the 3rd column as 'B';
end
16 件のコメント
Mathieu NOE
2022 年 12 月 14 日
Isn't it this way you wanted the structures be organized ?
fileDir = pwd; % choose your working directory
start_line = 2;
stop_line = 150;
S = dir(fullfile(fileDir,'F*.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)
[A,B,C,E] = do_the_job(fileDir, S(k).name,start_line,stop_line);
% size(A)
% size(B)
fie1=sprintf('b%d',k);
BS.(fie1) = B;
fie2=sprintf('a%d',k);
AS.(fie2) = A;
end
you don't need a second for loop, everything is done in the first loop
now AS is
AS = struct with fields:
a1: [75×1 double] filled with A array of first FX file
a2: [75×1 double] filled with A array of second FX file
a3: [75×1 double] filled with A array of third FX file
a4: [75×1 double] filled with A array of fourth FX file
same logic for BS :
BS = struct with fields:
b1: [75×1 double] filled with B array of first FX file
b2: [75×1 double] filled with B array of second FX file
b3: [75×1 double] filled with B array of third FX file
b4: [75×1 double] filled with B array of fourth FX file
その他の回答 (1 件)
Arif Hoq
2022 年 12 月 9 日
try this:
textfiles = dir('*.txt');
numfiles = length(textfiles);
mydata = cell(1, numfiles);
for k = 1:numfiles
mydata{k} = readmatrix(textfiles(k).name);
end
a=[mydata{:}];
maindata=a(1:149,:);
idx=1;
b=[maindata(:,idx:idx+2); maindata(:,idx+3:idx+5); maindata(:,idx+6:idx+8)];
% odd rows of the 1st column as 'A'
A=b(1:2:end,1);
% the numbers in the even rows of the 3rd column as 'B'
B=b(2:2:end,3);
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Data Type Conversion についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!