I need a little help with reading from file.

조회 수: 3 (최근 30일)
Tamás Zsombor Tolvaj
Tamás Zsombor Tolvaj 2022년 4월 28일
댓글: dpb 2022년 4월 28일
There's a file containing the coordinates of 10 people at different time (time goes from 1 to 200). The file looks like this:
1
t 1 2 3 ... 200
x 0 -1 -2 ... -11
y 0 1 2 ... 0
2
t 1 2 3 ... 200
x 0 0 1 ... -1
y 0 0 1 ... -3
.
.
.
10
t 1 2 3 ... 200
x 0 0 -1 ... -6
y 0 1 0 ... 7
1-10 are the numbers of the people.
t and the numbers from 1 to 200 are the time stamps.
x is the x-coordinate, y is the y-coordinate (these are random).
I have tried different ways to read the file, but none of them worked. I need to be able to access each number and the t,x,y characters as well (by access, I mean to display the number/character, etc).
How can I read a file like this? Does it require some sort of hybrid format specifier?
The code to call the function, and under it is my try to read from the file:
clear all;
filename='gyak08_szorg_data1.txt';
my_t=3;
my_x=1;
my_y=-1;
adat = talalkozasok(my_t, my_x, my_y, filename)
function adat = talalkozasok(my_t, my_x, my_y, filename)
fib=fopen(filename);
adat = fscanf(fib, '%c\n');
end
  댓글 수: 6
Dyuman Joshi
Dyuman Joshi 2022년 4월 28일
You can use import tool to import data from your file and proceed further.
Tamás Zsombor Tolvaj
Tamás Zsombor Tolvaj 2022년 4월 28일
And is there a way to do it with fscanf in the code like I did above? I mean this is something of a school exam, and the tasks after this are about creating cell arrays and writing the file data into those cells, so I cant really use import data for that. I need to write my code in our school's website, which manually runs the funtions and submits them.

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

채택된 답변

dpb
dpb 2022년 4월 28일
편집: dpb 2022년 4월 28일
That's an annoyingly difficult form to parse -- looks nice to read, but the mixture of text and data and different number variables per record makes it very irregular to parse.
Simplest thing I found was something like
data=readcell('gyak08_szorg_data1.txt'); % just bring in as Nx1 cell array
t=str2double(split(strrep(data(2),'t ',''))); % t is same all records, just read one
x=str2double(split(strrep(data(3:4:end),'x ',''))); % parse the x, y data
y=str2double(split(strrep(data(4:4:end),'y ','')));
If there were different times for some files, then just read the full array same as for x, y.
In future, create more regular, easily parsed data file formats!!! :)
  댓글 수: 2
Tamás Zsombor Tolvaj
Tamás Zsombor Tolvaj 2022년 4월 28일
Okay, this one works the best so far. I probably will do the rest myself. Thank you!
dpb
dpb 2022년 4월 28일
This probably won't go over well with instructor of introductory MATLAB course, plus, of course, it isn't your own work...if had noted it being classwork I'd have given hints, not full solution. :)
One can, of course use fscanf and/or fgetl and parse the file in conventional manner; depending upon just what you have covered and your instructor's penchant for how to approach things one could attack it in several ways.
The typical problem one runs into with such formats with fscanf or textscan in these situations is the variable line length that the file pointer runs off into never-never land when it fails on the conversion if not given a counted number of fields to parse. The way around that is to count delimiters or have a field in the file that can be read to know how many fields are expected but this file format doesn't have such -- part of the poor design.
Hence, if it were me, I'd probably opt for the fgetl solution and parse each line as I read it...

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 String Parsing에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by