sscanf not working for text on multiple lines.

I'm trying to read text from a file and put it into various collums. It works when I use the following txt and script:
My txt file looks like:
{co-ordinates 1.5 2.5 4.8 weighting 11.713}{co-ordinates 2.5 2.8 1.7 weighting 21.4}{co-ordinates 1.5 2.5 4.8 weighting 11.7}
My code looks like:
fopen practice2.txt
str = fileread('practice2.txt')
mat = sscanf(str,'{co-ordinates%f%f%f weighting%f}',[4,Inf]).'
mat =
1.5000 2.5000 4.8000 11.7130
2.5000 2.8000 1.7000 21.4000
1.5000 2.5000 4.8000 11.7000
Now im trying to use a different txt file that looks like this:
{
co-ordinates 102.10 93.30 128.50
weighting 1.000000}
{
co-ordinates 99.60 98.50 124.00
weighting 0.622901
}
and now all of a sudden the code doesn't work at all!? Any idea why it's no longer working and how to fix it? Thanks!

댓글 수: 2

Guillaume
Guillaume 2020년 3월 31일
Can you attach to your question an example file
I've uploaded the text file! It has a different file name than in the code but i'm aware of this.

댓글을 달려면 로그인하십시오.

 채택된 답변

Guillaume
Guillaume 2020년 3월 31일

0 개 추천

"now all of a sudden the code doesn't work at all!"
Well, yes that would be because the text portion in your sample file is not 'co-ordinates' and 'weighting' but 'position' and 'weight', so of course when sscanf looks for 'co-ordinates' it can't fail it and aborts. You could change your sscanf format to reflect the actual text of the file:
mat = sscanf(str,' { position%f%f%f weight%f}'), [4, Inf]).'
or just tell sscanf to ignore the text whatever it is, so it works in both cases:
mat = sscanf(str, ' {%*s%f%f%f%*s%f}', [4, Inf]).'

댓글 수: 4

oops, sorry I have actually updated by code so that it's looking for the right wording within the text file so that's not the problem. It basically seems to have a problem when the text file changes from one lone string, to text on multiple lines.
fopen practice2new.txt
str = fileread('practice2new.txt')
mat = sscanf(str,'{ position%f%f%f weight%f}',[4,Inf]).'
this is what i'm using and it gives nothing.
Actually, your second option seems to have worked!! I wonder why it wasn't working when using 'position' and 'weight'... thanks :)
Oh I forgot to say, the line:
fopen practice2new.txt
is completely unnecessary. For a start, that's not how you use fopen and this will leave the file open so may prevent other programs from accessing it. In any case, fileread opens the file on its own.
sscanf has so weird logic which always baffles me. With the first syntax you do need to be careful about the spaces around the text. With the %*s, the spaces are not required.
Note that you could always remove all the extra whitespace in your file with:
str = fileread('practice2.txt');
str = regexprep(str, '\s+', ' '); %replace all sequences of whitespaces (tab, spaces, line ends, etc) by just one space
but that's not really required for sscanf.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Data Import and Export에 대해 자세히 알아보기

질문:

2020년 3월 31일

댓글:

2020년 3월 31일

Community Treasure Hunt

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

Start Hunting!

Translated by