Just to avoid any ambiguity, a sample data file would be as follows: 10,12,15 13,28 4 9 33,55
Basically; Any number of lines, each of which has 1 or more comma separated values. There are no leading commas, no trailing commas, no embedded spaces, no blank lines. Mike --- In [email protected], "Mike" <sfclimb...@...> wrote: > > > Hi, > > I took a look at my original post (now that I have AmiBroker in front of > me). I mistakenly reversed the arguments to StrFind, which you have > corrected. I also indicated in my notes that the code would work for > multiline csv files, but did not actually include any handling for the > newline characters. > > Whereas my original code worked for a single line of multiple IDs > separated by commas, but not multiple lines. Your proposed revision > works for multiple lines of single entries but not for lines with > multiple IDs. > > If you plan to have a single ID per line in your file, then you can get > rid of the whole building up of the ids string altogeather. The only > reason for prepending the initial "," concatenating the results and > appending the final "," was to be able to do a generic StrFind using > comma delimiters. e.g. given "10,5,24" would end up with ",10,5,24," and > could generically search for ",<any value>,". > > Below is a corrected version of my original that passes the StrFind > arguments in the right order and has been corrected to strip any newline > characters found. Note that the last line of a file might not have a > newline. This version delivers on my original claim to handle any number > of comma seperated values on each of any number of lines. > > function IncludeIndustry( id ) > { > local ids; > local fh; > local line; > > ids = ","; > fh = fopen( "C:\\temp\\filter.csv", "r" ); > > if ( fh ) > { > while ( !feof( fh ) ) > { > line = fgets( fh ); > > if ( StrFind( line, "\n" ) ) > { > line = StrLeft( line, StrLen( line ) - 1 ); > } > > ids += line; > ids += ","; > } > } > > _TRACE(ids); > return StrFind( ids, "," + id + "," ); > } > > Filter = IncludeIndustry( IndustryID() ); > > AddColumn( IndustryID(), "Industry" ); > > > A couple of additional notes on your last submission: > > * Your usage of Match = IIf(RID > 0,1,0); is redundent. Filter will > accept any non zero value. Just set Filter = RID. Better yet, Filter = > IncludeIndustry(IndustryID()) as per the original code, unless you > specifically wanted to keep the return value for something. Either way, > get rid of Match. > * Try to avoid calling the same function repeatedly. You've already > stored the value of IndustryID() in IID, so just use IID from that point > on instead of calling IndustryID() again. > * Your assumption that ever line in the file will end with a "\n" is > false. The last line might not. > * ids is declared as local in the function, therefore it is not > available to your trace statements in the main script. The IDS > declaration that you added above the function is not the same variable > as what is used inside the function. > > Just for kicks, if you wanted to only ever run the file reading once per > AmiBroker session, you could use a static variable to hang on to the > values read and skip the redundent reading on any subsequent calls. This > would not be a good idea if you plan to modify the .csv file while > AmiBroker is still running. But, it will speed up your exploration if > you don't plan to change the .csv file. > > function GetIndustries() > { > local ids; > local fh; > local line; > > ids = StaticVarGetText( "StaticIDs" ); > > if ( StrLen( ids ) == 0 ) > { > _TRACE( "Inside static block" ); > fh = fopen( "C:\\temp\\filter.csv", "r" ); > > if ( fh ) > { > ids = ","; > > while ( !feof( fh ) ) > { > line = fgets( fh ); > > if ( StrFind( line, "\n" ) ) > { > line = StrLeft( line, StrLen( line ) - 1 ); > } > > ids += line; > ids += ","; > } > } > > StaticVarSetText( "StaticIDs", ids ); > } > > return ids; > } > > function IncludeIndustry( id ) > { > return StrFind( GetIndustries(), "," + id + "," ); > } > > Filter = IncludeIndustry( IndustryID() ); > > AddColumn( IndustryID(), "Industry" ); > > Mike > > > --- In [email protected], "gmorlosky" <gmorlosky@> wrote: > > > > One slight edit. In the following line I needed to change the "," to > "\n", else a ,1 is equal to ,10 or ,100. working Great > > > > return StrFind( ids, "," + id + "\n," ); > > > > > > [email protected], "gmorlosky" gmorlosky@ wrote: > > > > > > Hi Mike; > > > I figured it out, THANKS to all your help. The creation of the ids > file has a format that includes an end of line on each line and it is > counted as a position, SO if I expect token 4 it is actually finding 13 > as the position, when I reset the StrFind code to not include the last > ",", because that found nothing. Therfore I coded the filter for > 0 > (meaning the number was found), then it works > > > > > > return StrFind( ids, "," + id /* + "," */ ); // removed last comma > > > ,0 // 0,1,2 > > > ,1 // 3,4,5 > > > ,2 // 6,7,8 > > > ,3 // 9,10,11 > > > ,4 // 12,13 > > > > > > I then tested against the following and it worked great. > > > ,0 > > > ,2 > > > ,20 > > > ,200 > > > > > > Below is the working code: > > > > > > _SECTION_BEGIN("ReadingCSV Function"); > > > Title = "ReadingCSV Function"; > > > IndID = 0; > > > IID = 0; > > > ids = ""; > > > function IncludeIndustry( id ) > > > { > > > local ids; > > > local fh; > > > ids = ","; > > > fh = fopen( "C:\\AmiBroker CSV\\ABTest.csv", "r" ); > > > if ( fh ) > > > { > > > while ( !feof( fh ) ) > > > { > > > ids += fgets( fh ); > > > ids += ","; > > > } > > > fclose( fh ); > > > printf( ids ); > > > } > > > // return StrFind( "," + id + "," , ids); // original code > > > return StrFind( ids, "," + id /* + "," */ ); > > > } > > > //Filter = IncludeIndustry( IndustryID() ); // original code > > > IID = IndustryID(); > > > RID = IncludeIndustry( IndustryID() ); > > > Match = IIf(RID > 0,1,0); > > > Filter = Match; > > > Check = IndustryID() == RID; > > > Buy = Close >= 0; > > > Sell = Close == 0; > > > AddColumn ( Buy,"Buy" ); > > > AddColumn ( Sell,"Sell" ); > > > AddColumn ( Close,"Close" ); > > > AddTextColumn( FullName(),"FullName" ); > > > AddColumn( IndustryID(), "IndId" ); > > > AddColumn( Check, "Check" ); > > > _TRACE ("IID: "+ IID +" RID: "+ RID +" IDS: "+ IDS+" Match: "+ > Match); > > > _SECTION_END(); > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --- In [email protected], "gmorlosky" <gmorlosky@> wrote: > > > > > > > > I started using _TRACE and find that the only number that comes > back from "IndustryID() == IncludeIndustry( IndustryID() )" is 0, > therefore IndustryID == 0 works, but all others fail. > > > > Wondering if the problem is with the format of the created IDs > file or the read of the IDs file ??? > > > > > > > > Any thoughts > > > > > > > > --- In [email protected], "gmorlosky" <gmorlosky@> wrote: > > > > > > > > > > Here is the latest code, but it still is displaying in an > Explore only IndustryID() == 0. > > > > > I did make 2 changes to the code: > > > > > 1) flipped the StrFind parameters > > > > > 2) expanded the Filter to include IndustryID() == > > > > > 3) Commentary display of printf(ID) looks like this: > > > > > > > > > > ,,0 > > > > > ,1 > > > > > ,2 > > > > > ,3 > > > > > ,4 > > > > > ,5 > > > > > ,6 > > > > > ,7 > > > > > ,8 > > > > > ,9 > > > > > ,10 > > > > > ,, > > > > > > > > > > > > > > > > > > > > _SECTION_BEGIN("ReadingCSV Function"); > > > > > Title = "ReadingCSV Function"; > > > > > id = 0; > > > > > function IncludeIndustry( id ) > > > > > { > > > > > local ids; > > > > > local fh; > > > > > > > > > > ids = ","; > > > > > fh = fopen( "C:\\AmiBroker CSV\\ABTest.csv", "r" ); > > > > > > > > > > if ( fh ) > > > > > { > > > > > while ( !feof( fh ) ) > > > > > { > > > > > ids += fgets( fh ); > > > > > ids += ","; > > > > > printf( ids ); > > > > > } > > > > > fclose( fh ); > > > > > } > > > > > // return StrFind( "," + id + "," , ids); // original code > > > > > return StrFind( ids, "," + id + "," ); > > > > > } > > > > > > > > > > //Filter = IncludeIndustry( IndustryID() ); // original code > > > > > Filter = IndustryID() == IncludeIndustry( IndustryID() ); > > > > > > > > > > Buy = Close >= 0; > > > > > Sell = Close == 0; > > > > > AddColumn ( Buy,"Buy" ); > > > > > AddColumn ( Sell,"Sell" ); > > > > > AddColumn ( Close,"Close" ); > > > > > AddTextColumn( FullName(),"FullName" ); > > > > > AddColumn( id, "Id" ); > > > > > _SECTION_END(); > > > > > > > > > > > > > > >
