Using textscan wisely, different data type
1 回表示 (過去 30 日間)
古いコメントを表示
Hi there, I'm trying to read lines from a text file and then alter one of the numbers. a line looks like this:
1 1 2 3535.68 4572 120 0 Closed ;
I want change the 6th number (120). this is what i did and I know it's ugly:
a=textscan(tline{i},'%s %s %s %s %s %d %s %s %s');
newl=i-s1+1;
b=[a{1}{1} ' ' a{2}{1} ' ' a{3}{1} ' ' a{4}{1} ' ' a{5}{1} ...
' ' num2str(aa(newl,end)) ' '...
a{7}{1} ' ' a{8}{1} a{9}{1}];
tline{i}=b;
What would be an elegant to achieve my purpose? Thanks, Asher
0 件のコメント
回答 (1 件)
dpb
2015 年 8 月 2 日
編集済み: dpb
2015 年 8 月 3 日
Presuming the file is regular in format, something on the lines of
fmt=[repmat('%f',1,7) '*%s ;']; % format string
fid=fopen('thefile');
data=cell2mat(textscan(fid,fmt,'collectoutput',1));
Now you'll have one array of doubles ignoring the last column of string data.
Then simply iterate thru the rows of the array making the numeric substitution in memory where needed either by looking for particular values if that's the basis for making the change or by position in the array if that is, instead, the determining factor. You give no indication on the "why" in choosing the 120 value for the change so we don't know that.
Then, you can rewrite the file with the specific format if that's important or with a generic export routine if it isn't.
ADDENDUM Oh, you'll have to retrieve the string as well to rewrite the full in toto so you'll end up w/ a cell array w/ a numeric array and the cell string when take out the * of the '*%s' part of the format string...the previous will still hold for making the numeric changes as before.
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Text Files についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!