How do I split this data into different column and write it back in a text file with an extention .bdf?

1 view (last 30 days)
Adeline War
Adeline War on 5 Jul 2022
Commented: dpb on 9 Jul 2022
I would like to split this data into different columns without any emoty cells and write it into a text file and save it as .bdf. Can you helps me ?
MAT1,88813,210000.0,,0.3,7.85e-09,,,,
MAT1,88815,210000.0,,0.3,7.85e-09,,,,
MAT1,88816,210000.0,,0.3,7.85e-09,,,,
MAT1,88817,210000.0,,0.3,7.85e-09,,,,
MAT1,88818,210000.0,,0.3,7.85e-09,,,,

Accepted Answer

dpb
dpb on 5 Jul 2022
Edited: dpb on 6 Jul 2022
data=readlines('mat.fem');
M=split(data(startsWith(data,'MAT1'),:),',');
M(:,4)=num2str(rand(size(M,1),1));
modifies MAT1 as per request...
Now, we're still at a loss as to what to write -- you complain you can't remove empty columns, but say to write back in "the same original format" which would be comma-delimited with trailing empty fields.
So, which is it???
LATER RESUMPTION AFTER REFLECTION ON LIKELY SCENARIOS
OK, so presuming to take the "original" at face value, then next step is to replace the MAT1 section in the overall array and output the updated array --
M=join(M,','); % put back into csv form by line
ix=startsWith(data,'MAT1'); % locate in original array
data(ix)=M; % and replace with new/revised set
writematrix(data,'mat1.fem') % and write out
NB: I changed filename in last to not overwirte the original; salt to suit.
A minor efficiency improvement would be to compute the index vector ix first and use it to select M in the second line above as well -- saves doing same thing twice't as is in above as given.
  6 Comments

Sign in to comment.

More Answers (3)

dpb
dpb on 5 Jul 2022
Edited: dpb on 5 Jul 2022
So, what is this -- the content of some file, an array of text, a cell array... ??
What are we looking at here?
If it's a text file, simply
data=readcell('yourInputFile.ext');
data(:,all(~ismissing(string(data))));
will provide a cell array of the content w/o missing column(s).
Now, what is a ".bdf" file format to write???
ADDENDUM:
An alternative is to not bring in the empty cells to begin with -- use the import options object:
opt=detectImportOptions('addie.txt','MissingRule','omitvar');
data=readcell('yourInputFile.ext');
and your data array won't have missing variables in the first place.
We're still awaiting word on the output format to finish up...
  4 Comments

Sign in to comment.


Karim
Karim on 5 Jul 2022
Edited: Karim on 5 Jul 2022
Hi @Adeline War, assumig you have the data in a string array, you can use the procedure below.
MyData = ["MAT1,88813,210000.0,,0.3,7.85e-09,,,,"
"MAT1,88815,210000.0,,0.3,7.85e-09,,,,"
"MAT1,88816,210000.0,,0.3,7.85e-09,,,,"
"MAT1,88817,210000.0,,0.3,7.85e-09,,,,"
"MAT1,88818,210000.0,,0.3,7.85e-09,,,,"]
MyData = 5×1 string array
"MAT1,88813,210000.0,,0.3,7.85e-09,,,," "MAT1,88815,210000.0,,0.3,7.85e-09,,,," "MAT1,88816,210000.0,,0.3,7.85e-09,,,," "MAT1,88817,210000.0,,0.3,7.85e-09,,,," "MAT1,88818,210000.0,,0.3,7.85e-09,,,,"
% replace the comma
MyData = strrep(MyData,","," ")
MyData = 5×1 string array
"MAT1 88813 210000.0 0.3 7.85e-09 " "MAT1 88815 210000.0 0.3 7.85e-09 " "MAT1 88816 210000.0 0.3 7.85e-09 " "MAT1 88817 210000.0 0.3 7.85e-09 " "MAT1 88818 210000.0 0.3 7.85e-09 "
% delete double spaces
MyData = regexprep(MyData,' +',' ')
MyData = 5×1 string array
"MAT1 88813 210000.0 0.3 7.85e-09 " "MAT1 88815 210000.0 0.3 7.85e-09 " "MAT1 88816 210000.0 0.3 7.85e-09 " "MAT1 88817 210000.0 0.3 7.85e-09 " "MAT1 88818 210000.0 0.3 7.85e-09 "
% print the data to .bdf file
MyFile = fopen('test.bdf','w+');
fprintf(MyFile,'%s\n',MyData);
fclose(MyFile);

Adeline War
Adeline War on 5 Jul 2022
clc;
clear;
close;
[fp2 pn2] = uigetfile('mat.fem');
cd(pn2);
fileID = fopen(fp2);
C = textscan(fileID,'%s','Delimiter','\n');
a = C{1,1};
dm1=find(strncmp(a,'CTETRA',5));
dm2=(a(dm1));
dm4 = split(dm2,',');
mat = find(strncmp(a,'MAT1',3));
mat_1 = (a(mat));
F = split(mat_1,',');
I have attached here the code and file. I am unable to split MAT1 with comma delimeters and without empty column. Also, could we update 3rd column of MAT1 with any new random numbers and paste all this data in the same original format and save it as a .fem file. The only changes has to be for the MAT1 data.
  2 Comments
dpb
dpb on 5 Jul 2022
C = textscan(fileID,'%s','Delimiter','\n');
is archaic and worst possible way (other than, perhaps, impordata) to approach.
What release of MATLAB are you using? Unless it's very old and you can't update; this is NOT the way to write new code (and given the little code that is here that is optimal, there's no real good reason to keep this and not rewrite it more effeciently.)

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!