help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: reading data using fgets in while loop


From: financial engineer
Subject: RE: reading data using fgets in while loop
Date: Mon, 12 Mar 2012 15:46:50 -0400



> Date: Mon, 12 Mar 2012 20:29:22 +0100
> From: address@hidden
> To: address@hidden
> CC: address@hidden
> Subject: Re: reading data using fgets in while loop
>
> financial engineer wrote:
> >
> >
> > > Date: Mon, 12 Mar 2012 11:14:44 -0700
> > > From: address@hidden
> > > To: address@hidden
> > > Subject: RE: reading data using fgets in while loop
> > >
> > >
> > > 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.
> > > _______________________________________________
> > > Help-octave mailing list
> > > address@hidden
> > > https://mailman.cae.wisc.edu/listinfo/help-octave
> >
> > hi Philip,
> > yes indeed, my version is older...I am running
> > octave-3.2.4:1>
> > this is the standard package in the applications in ubuntu v.10, and
> > that is what I installed.
> > thanks for that link...it seems like I am missing a few .m running the
> > older version.
> > thanks,
> > Bobby
>
> By sheer coincidence, Carnë (octave-forge site admin) just emailed me
> about csv2cell (in the miscellaneous package) that also can read your
> file. It works OK in 3.2.4 (just tested it:
>
> octave-3.2.4.exe:1> C = csv2cell ('tst.csv', ",")
> C =
>
> {
> [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
> [1,2] = H (Mar 12)
> [2,2] = H (Mar 12)
> [3,2] = H (Mar 12)
> [4,2] = H (Mar 12)
> [5,2] = H (Mar 12)
> [6,2] = H (Mar 12)
> [1,3] = 26.750
> [2,3] = 26.280
> [3,3] = 26
> [4,3] = 25.500
> [5,3] = 25.350
> [6,3] = 25.050
> [1,4] = 2584
> [2,4] = 2330
> [3,4] = 3198
> [4,4] = 3045
> [5,4] = 2314
> [6,4] = 2685
> }
>
> octave-3.2.4.exe:3> C{6, 4}
> ans = 2685
> octave-3.2.4.exe:4> ischar (C{6, 4})
> ans = 0
> octave-3.2.4.exe:5> isnumeric (C{6, 4})
> ans = 1
> octave-3.2.4.exe:6> isnumeric (C{6, 2})
> ans = 0
> octave-3.2.4.exe:7> ischar (C{6, 2})
> ans = 1
>
> So it looks good. Try it!
>
> Philip

nice.....thanks Philip

reply via email to

[Prev in Thread] Current Thread [Next in Thread]