Greetings,
I have this code: ****** read "read the category file into the dictionary the first item is the category, the rest of the line are payees office expense|home depot|staples|costco groceries|natures best|jewel|trader joes|fresh thyme " | f line | f := FileStream oldFileNamed: myfile. [(line := f nextLine) notNil] whileTrue: [ | array cat payees | array := line findTokens: $| escapedBy: Character tab . cat := array first. payees := array reject: [ :i | i = cat ]. "rest of the line" payees do: [ :p | mydict at: (p withBlanksCondensed) put: (cat withBlanksCondensed)]. ]. f close. ********* I am getting some blank lines in the data file. Lines with just a Character cr. I was wondering how to handle that. In other languages, there is a break for the loop, to go to the end. I can do: (line size < 2) ifTrue: [ f nextLine.]. But that would interfere with the notNil idiom at the end of the file. So where do I put this. Is there a common way to jump to the end? Sincerely, Joe. _______________________________________________ Beginners mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/beginners |
_______________________________________________ Beginners mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/beginners |
In reply to this post by Joseph Alotta
Hi Joe,
Better than checking for #nextLine answering nil, I think you can send the file stream #atEnd to see if there is any more data. You would then use a #whileFalse: and move the #nextLine call into the second block of the whileFalse:. Then test for empty lines with something like: (line size < 2) ifFalse: [...putting all the code that does the work on a line with data in here...]. Lou PS. If this is not a school project, we can be of more help, we just don't like doing students projects for them as they learn more with just a few hints and not real code. On Mon, 25 Apr 2016 10:16:33 -0500, Joseph Alotta <[hidden email]> wrote: >Greetings, > >I have this code: > >****** > >read > "read the category file into the dictionary > the first item is the category, the rest of the line are payees > > office expense|home depot|staples|costco > groceries|natures best|jewel|trader joes|fresh thyme > " > >| f line | >f := FileStream oldFileNamed: myfile. > >[(line := f nextLine) notNil] whileTrue: [ | array cat payees | > > array := line findTokens: $| escapedBy: Character tab . > > cat := array first. > payees := array reject: [ :i | i = cat ]. "rest of the line" > > payees do: [ :p | mydict at: (p withBlanksCondensed) put: (cat withBlanksCondensed)]. > ]. > > >f close. > >********* > >I am getting some blank lines in the data file. Lines with just a Character cr. I was wondering how to handle that. In other languages, there is a break for the loop, to go to the end. I can do: > >(line size < 2) ifTrue: [ f nextLine.]. > >But that would interfere with the notNil idiom at the end of the file. So where do I put this. Is there a common way to jump to the end? > > >Sincerely, > > >Joe. Louis LaBrunda Keystone Software Corp. SkypeMe callto://PhotonDemon _______________________________________________ Beginners mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/beginners |
Hi Louis,
This is not a school project. I was looking for a local tutor but could find none. So this is me doing this instead of working crossword puzzles or sudukos. So your advice would be: (f atEnd) whileFalse: [ line := f nextLine (line size < 2) ifFalse: [ “process line”]. ]. Sincerely, Joe. > On Apr 25, 2016, at 10:06 AM, Louis LaBrunda [via Smalltalk] <[hidden email]> wrote: > > Hi Joe, > > Better than checking for #nextLine answering nil, I think you can send the file stream #atEnd > to see if there is any more data. You would then use a #whileFalse: and move the #nextLine > call into the second block of the whileFalse:. Then test for empty lines with something like: > (line size < 2) ifFalse: [...putting all the code that does the work on a line with data in > here...]. > > Lou > > PS. If this is not a school project, we can be of more help, we just don't like doing > students projects for them as they learn more with just a few hints and not real code. > > On Mon, 25 Apr 2016 10:16:33 -0500, Joseph Alotta <[hidden email]> wrote: > > >Greetings, > > > >I have this code: > > > >****** > > > >read > > "read the category file into the dictionary > > the first item is the category, the rest of the line are payees > > > > office expense|home depot|staples|costco > > groceries|natures best|jewel|trader joes|fresh thyme > > " > > > >| f line | > >f := FileStream oldFileNamed: myfile. > > > >[(line := f nextLine) notNil] whileTrue: [ | array cat payees | > > > > array := line findTokens: $| escapedBy: Character tab . > > > > cat := array first. > > payees := array reject: [ :i | i = cat ]. "rest of the line" > > > > payees do: [ :p | mydict at: (p withBlanksCondensed) put: (cat withBlanksCondensed)]. > > ]. > > > > > >f close. > > > >********* > > > >I am getting some blank lines in the data file. Lines with just a Character cr. I was wondering how to handle that. In other languages, there is a break for the loop, to go to the end. I can do: > > > >(line size < 2) ifTrue: [ f nextLine.]. > > > >But that would interfere with the notNil idiom at the end of the file. So where do I put this. Is there a common way to jump to the end? > > > > > >Sincerely, > > > > > >Joe. > -- > Louis LaBrunda > Keystone Software Corp. > SkypeMe callto://PhotonDemon > > _______________________________________________ > Beginners mailing list > [hidden email] > http://lists.squeakfoundation.org/mailman/listinfo/beginners > > > If you reply to this email, your message will be added to the discussion below: > http://forum.world.st/go-to-the-end-of-a-loop-tp4891930p4891939.html > To start a new topic under Squeak - Beginners, email [hidden email] > To unsubscribe from Squeak - Beginners, click here. > NAML |
Yes, except #whileFalse: only works against blocks. So: [f atEnd] whileFalse: [ On Mon, Apr 25, 2016 at 9:59 AM, Joseph Alotta <[hidden email]> wrote: Hi Louis, _______________________________________________ Beginners mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/beginners |
Hi Joseph! Here is my take on your problem:categoriesByPayees := Dictionary new. FileStream readOnlyFileNamed: 'payees-by-categories.txt' do: [ :file | " With #readOnlyFileNamed:do: you don't have to worry about closing the file, it ensures that #close is sent to the file, even if you leave the block through an Exception. " [ file atEnd ] whileFalse: [ | parts | parts := (file nextLine findTokens: $| escapedBy: Character tab) collect: #withBlanksCondensed. " We collect the parts #withBlanksCondensed, so we don't have to call it repeatedly in the loop. You can use unary selectors in place of blocks with one argument. You may look at the implementation of Collection >> #collect: and Symbol >> #value: to find out why. I'm not sure what you really want is #findTokens:escapedBy:, it cuts the string along | characters if they are not preceded by a tab." parts size > 1 ifTrue: [ " We skip blank lines or categories without at least one payee. " | category | category := parts first. parts allButFirstDo: [ :payee | (categoriesByPayees at: payee ifAbsentPut: [ OrderedCollection new ]) add: category " Your implementation only remembers the last category encountered for a payee. We can collect all the categories. " ] ] ] ] Cheers, Balázs _______________________________________________ Beginners mailing list [hidden email] http://lists.squeakfoundation.org/mailman/listinfo/beginners |
thank you. i will studying this.
sincerely, Joe. > On Apr 26, 2016, at 7:48 AM, Balázs Kósi [via Smalltalk] <[hidden email]> wrote: > > categoriesByPayees := Dictionary new. > FileStream readOnlyFileNamed: 'payees-by-categories.txt' do: [ :file | > " With #readOnlyFileNamed:do: you don't have to worry about closing the file, > it ensures that #close is sent to the file, even if you leave the block through an Exception. " > [ file atEnd ] whileFalse: [ > | parts | > parts := (file nextLine findTokens: $| escapedBy: Character tab) > collect: #withBlanksCondensed. > " We collect the parts #withBlanksCondensed, so we don't have to call it repeatedly in the loop. > You can use unary selectors in place of blocks with one argument. You may look at the implementation > of Collection >> #collect: and Symbol >> #value: to find out why. I'm not sure what you really want is > #findTokens:escapedBy:, it cuts the string along | characters if they are not preceded by a tab." > parts size > 1 ifTrue: [ > " We skip blank lines or categories without at least one payee. " > | category | > category := parts first. > parts allButFirstDo: [ :payee | > (categoriesByPayees > at: payee > ifAbsentPut: [ OrderedCollection new ]) add: category > " Your implementation only remembers the last category encountered for a payee. > We can collect all the categories. " ] ] ] ] |
Free forum by Nabble | Edit this page |