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: Philip Nienhuis
Subject: Re: reading data using fgets in while loop
Date: Mon, 12 Mar 2012 20:29:22 +0100
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11) Gecko/20100701 SeaMonkey/2.0.6

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


reply via email to

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