[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: reading data using fgets in while loop
From: |
PhilipNienhuis |
Subject: |
RE: reading data using fgets in while loop |
Date: |
Mon, 12 Mar 2012 11:14:44 -0700 (PDT) |
newbie_octave wrote
>
>> Date: Mon, 12 Mar 2012 10:17:32 -0700
>> From: pr.nienhuis@
>> To: help-octave@
>> Subject: Re: reading data using fgets in while loop
>>
>>
>> newbie_octave wrote
>> >
>> > I have a .csv file with the following data
>> >
>> > 01/03/2012,H (Mar 12),26.750000,2584
>> > 01/04/2012,H (Mar 12),26.280000,2330
>> > 01/05/2012,H (Mar 12),26.000000,3198
>> > 01/06/2012,H (Mar 12),25.500000,3045
>> > 01/09/2012,H (Mar 12),25.350000,2314
>> > 01/10/2012,H (Mar 12),25.050000,2685
>> >
>> > and I am a newbie to octave. I ran the following command to read the
>> above
>> > data into octave
>> >
>> > X=csvread("/tmp/hist.csv")
>> >
>> > but it returns the following matrix.
>> >
>> > 1.0000e+00 0.0000e+00 2.6750e+01 2.5840e+03
>> > 1.0000e+00 0.0000e+00 2.6280e+01 2.3300e+03
>> > 1.0000e+00 0.0000e+00 2.6000e+01 3.1980e+03
>> > 1.0000e+00 0.0000e+00 2.5500e+01 3.0450e+03
>> > 1.0000e+00 0.0000e+00 2.5350e+01 2.3140e+03
>> > 1.0000e+00 0.0000e+00 2.5050e+01 2.6850e+03
>> >
>> >
>> > Obviously, it is not reading the text correctly
>> > so I am now using fgets() as follows:
>> >
>> > fid=fopen(fname);
>> > fout="out.mat"
>> > global tline;
>> > global tempstr;
>> > while 1
>> > tline = fgets(fid);
>> > sep=",";
>> > tempstr=strsplit(tline, sep);
>> > dt=tempstr(1);
>> > cname=tempstr(2);
>> > price=str2double(tempstr(3));
>> > volume=str2double(tempstr(4));
>> > if ~ischar(tline), break,end;
>> > end
>> > disp(tline);
>> > fclose(fid);
>> >
>> > but when I run the script, it returns -1 due to disp(tline) being after
>> > the end. I want to be able to compute the volume-weighted average
>> price,
>> > and not have to do it all within the script that reads the data from
>> the
>> > file. But, given that I cannot access any of the variables outside the
>> > while loop, I am stuck. Ideally, I could have used csvread() or
>> dlmread()
>> > but that is messing up the string fields in my file. Can anyone please
>> > suggest how I fix this so I can manipulate the variables outside the
>> while
>> > loop that gets the data from the .csv file. thanks!
>> >
>> > I also get the following error in using strsplit, and I don't
>> understand
>> > what mistake I am making as I am following the usage guidelines. I
>> tried
>> > split, but I am advised to use strsplit.
>> > octave-3.2.4:110> strsplit(tline,sep)
>> > error: Invalid call to strsplit. Correct usage is:
>> >
>> > -- Function File: [S] = strsplit (P, SEP, STRIP_EMPTY)
>> >
>> >
>> > Additional help for built-in functions and operators is
>> > available in the on-line version of the manual. Use the command
>> > `doc <topic>' to search the manual index.
>> >
>> > Help and information about Octave is also available on the WWW
>> > at http://www.octave.org and via the help@
>> > mailing list.
>> >
>>
>> There are a few more text reading functions that may help out.
>> E.g., textread:
>> (applied to your data in a file txt.csv)
>>
>> octave-3.6.1.exe:2> [a, b, c, d] = textread ('tst.csv', "%s %s %f %d",
>> "delimiter", ",")
>> a =
>> {
>> [1,1] = 01/03/2012
>> [2,1] = 01/04/2012
>> [3,1] = 01/05/2012
>> [4,1] = 01/06/2012
>> [5,1] = 01/09/2012
>> [6,1] = 01/10/2012
>> }
>> b =
>> {
>> [1,1] = H (Mar 12)
>> [2,1] = H (Mar 12)
>> [3,1] = H (Mar 12)
>> [4,1] = H (Mar 12)
>> [5,1] = H (Mar 12)
>> [6,1] = H (Mar 12)
>> }
>> c =
>>
>> 26.750
>> 26.280
>> 26.000
>> 25.500
>> 25.350
>> 25.050
>>
>> d =
>>
>> 2584
>> 2330
>> 3198
>> 3045
>> 2314
>> 2685
>>
>> With some postprocessing (e.g., datenum (a, "dd/mm/yyyy") ) you can get
>> any
>> output you want.
>>
>> Philip
>>
>>
>> --
>> View this message in context:
>> http://octave.1599824.n4.nabble.com/reading-data-using-fgets-in-while-loop-tp4464844p4466694.html
>> Sent from the Octave - General mailing list archive at Nabble.com.
>> _______________________________________________
>> Help-octave mailing list
>> Help-octave@
>> https://mailman.cae.wisc.edu/listinfo/help-octave
>
> thanks Philip,
> ...I realize that I don't have textread.m in my io folder. can you tell me
> where can I download it.
> Bobby
>
What Octave version on what operating system are we talking about?
I showed how to use textread() with Octave v.3.6.1; in 3.6.0 textread was
significantly improved.
If your Octave version is not too old (should be >= 3.4.0) you might
download textread.m + the required companion file strread.m here:
http://hg.savannah.gnu.org/hgweb/octave/file/05635e4c605a/scripts/io
and replace the ones on your hard disk in
./share/octave/<version>/m/io
(You'll have to search a bit where this exactly is, I don't know my way
around on your PC)
If you run an older Octave version (3.2.4 on Windows?) you're strongly
advised to upgrade a.s.a.p.
Philip
--
View this message in context:
http://octave.1599824.n4.nabble.com/reading-data-using-fgets-in-while-loop-tp4464844p4466883.html
Sent from the Octave - General mailing list archive at Nabble.com.
- Re: reading data using fgets in while loop, (continued)
- Re: reading data using fgets in while loop, indium, 2012/03/12
- RE: reading data using fgets in while loop, financial engineer, 2012/03/12
- Re: reading data using fgets in while loop, indium, 2012/03/12
- RE: reading data using fgets in while loop, financial engineer, 2012/03/12
- Re: reading data using fgets in while loop, indium, 2012/03/12
- RE: reading data using fgets in while loop, financial engineer, 2012/03/12
- Re: reading data using fgets in while loop, indium, 2012/03/13
- RE: reading data using fgets in while loop, financial engineer, 2012/03/13
Re: reading data using fgets in while loop, PhilipNienhuis, 2012/03/12