|
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 |
[Prev in Thread] | Current Thread | [Next in Thread] |