Find and extract column values from a text file
3 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Gloria Longo
il 13 Ott 2020
Commentato: Mathieu NOE
il 15 Ott 2020
Hi all,
I have a txt file and a part of it, it's like this below:
==============================================================================================================
Allestimento: Nr. 1 1.5 GSE T4 DOHC DDCT MHEV (P2 48V) LONGITUDE FWD EMEA Base 215/65 R16
Accessori :
==============================================================================================================
========================== = PESI = ============================ = ASSETTI = ===========================
condizione di carico asse asse asse K scuotim fle ant freqPro W scuotim fle pos freqPro beccheg
ant[kg] pos[kg] tot[kg] [mm] ant[mm] [mm/100kg] ant[Hz] [mm] pos[mm] [mm/100kg] pos[Hz] [gradi]
---------------------- ------- ------- ------- ------- ------- ---------- ------- ------- ------- ---------- ------- --------
Standard 0 887 528 1415 -14.7 8 36.4 1.3 -21.6 -13.8 44.3 1.58 0° 9'
Standard A 894 555 1449 -13.6 9.1 36.2 1.3 -15.6 -7.8 44.2 1.54 0° 2'
Assetto di Disegno 844 590 1434 -22.7 0 37.2 1.33 -7.8 0 43.9 1.49 0°-19'
Teorico di Progetto 973 685 1658 0.7 23.4 35.3 1.26 12.8 20.6 43.1 1.38 0°-16'
1 Persone + 0kg 927 591 1518 -7.5 15.2 35.9 1.28 -7.6 0.2 43.9 1.49 0° 0'
2 Persone + 0kg 960 628 1588 -1.6 21.1 35.3 1.27 0.4 8.2 43.6 1.44 0°-2'
3 Persone + 30kg 969 719 1688 0 22.7 35.2 1.26 20 27.8 42.8 1.35 0°-26'
5 Persone + 50kg 992 856 1848 4 26.7 35.1 1.25 40.2 48 17.4 1.92 0°-48'
4 Persone + 30kg 982 776 1758 2.2 24.9 35.4 1.25 32.3 40.1 42.2 1.3 0°-40'
0 Persone + 147kg 947 649 1596 -4 18.7 35.9 1.27 4.9 12.7 43.4 1.42 0°-12'
This txt file is "periodic", so this kind of table is present more than one time with different values. From this file, I have to extract the last column ('beccheg', see the underlined values) of all of these tables and put them in differents arrays (to be then sorted and to let me take only some values from them, always periodically: in particular the 'Standard A' value).
I started like this:
clear all;
fid = fopen('520MCA.lis','r');
text = textscan(fid,'%s','Delimiter','');
text = text{1};
fid = fclose(fid);
beccheggio = regexp(text,'Standard A[\s\.=]+(\d+){2}[\s\.=]+(\d+){3}[\s\.=]+(\d+){4}[\s\.=]+[-]+(\d+)','tokens')
beccheggio = [beccheggio{:}];
beccheggio = str2double([beccheggio{:}]).';
Then I blocked myself because of two reasons:
1) the regular expression to be matched, to reach the last value of the 'Standard A' row of each table, could be too long, complicated and not equal for each table
2) there is not just one row, within the period of the file, which started with 'Standard A'.
I hope someone can help me.
Thanks,
Mattia
Risposta accettata
Mathieu NOE
il 14 Ott 2020
So , hopefully now a solution that works
I put the excel output file as well, that includes min and max values for beccheg already computed
now I hope that the file structure will not change too much...
i prefered to stick with low level string functions. I asume another "expert" will find out that there are alternatives with the latest matlab versions. For my fun I still develop for R12 backward compatibility (if possible)
enjoy
4 Commenti
Mathieu NOE
il 14 Ott 2020
Hello Mattia
glad it works !
ok I think the "upgrades" are doable without much hard work. I'll have a look tomorrow
please send me on my email a couple of other data files so I can test the new code
ciao
Mathieu NOE
il 15 Ott 2020
And now the final version !
enjoy !
I have further refined the program and even simplified it a bit .
So the main script is : assetti1E.m
And it calls the function : retrieve_data.m
The major change is that I do not longer need my “stop line” calculation in the first portion of the code
If there is important thinks to know is to see the lines 96 to 98 in retrieve_data.m
% job for beccheg data retrieval
nb_lines_max = 20; % assuming table of data will never exceed this size
offset_start = 4;
Più risposte (1)
Mathieu NOE
il 13 Ott 2020
hello
see below :
fid = fopen('data.txt');
tline = fgetl(fid);
k = 0;
start_line = 9;
while ischar(tline)
k = k+1;
if k > start_line-1 % the extraction start when row index is 9
[m,n] = size(tline);
ind_stop = n;
ind_start = ind_stop-8; % the beccheg value must be written on max 8 character length (taken from the length of "--------" line above
beccheg_string = tline(ind_start:ind_stop);
% find index of "°" mark
ind_deg_separator = findstr(beccheg_string,'°');
Deg = str2num(beccheg_string(1:ind_deg_separator-1));
Minutes = str2num(beccheg_string(1+ind_deg_separator:end-1));
% conversion to degrees (D/M/S => deg
degrees(k+1-start_line,:) = Deg+Minutes/60;
end
tline = fgetl(fid);
end
fclose(fid);
degrees % left uncommented to check values in command window
%save or export as ascii or csv file : degrees
7 Commenti
Mathieu NOE
il 14 Ott 2020
sorry, I have no acces to google drive at the office - blocked by internet security firewall
if it's not too big you can send it per email at : mathieu.noe@hutchinson.com
Vedere anche
Categorie
Scopri di più su Language Support in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!