Gardner, Dean wrote:
>  So I took Kents advice and refactored but I have uncovered another
> problem which I am hoping people may be able to help with. I realized
> that the string I was using to identify the end of a record can in some
> cases not be found (i.e. if a commit wasn't reviewed). This can lead to
> additional records being returned. 
> 
> Can anyone suggest how I can get round this?

Your sample data doesn't seem to match either the problem you describe 
or the code. I suggest looking for the start of a record rather than the 
end. At the end of the record-finding loop you will have one last record 
still to process in the record list.

Kent
> 
> Text file example ( in this case looking for commit 1 would give details
> of commit two also):
> 
> ---- SomeSpec 0000-0001 ----
> 
>> some commit 1
> 
> Reviewed By: someone
> ---- SomeSpec 0000-0002 ----
>> some commit 2
> 
> ---- SomeSpec 0000-0003 ----
>> some commit 1
> Reviewed By: Someone
> 
> 
> Code:
> 
>  def searchChangeLog(self,filename):
>         uid = self.item.Uid()
>         record=[]
>         logList=[]
>         displayList=[]
>         f = open(filename)
>         logTextFile="temp.txt"
>         """ searched through the changelog 'breaking' it up into
>             individual entries"""
> 
>         for line in f:
>             if ("Reviewed: 000" in line):
>                 logList.append(record)
>                 record = []
>             else:
>                 record.append(line)
> 
>         """ searches to determine if we can find entries for
>             a particualr item"""
>         for record in logList:
>             for item in record:
>                 if uid in item:
>                     displayList.append(record)
>         """ creates a temporary file to write our find results to """
>         removeFile = os.path.normpath( os.path.join(os.getcwd(),
> logTextFile))
> 
>         # if the file exists, get rid of it before writing our new
> findings
>         if Shared.config.Exists(removeFile):
>             os.remove(removeFile)
>         recordLog = open(logTextFile,"a")
> 
>         for record in range(len(displayList)):
>             for item in displayList[record]:
>                 recordLog.write(item)
>         recordLog.close()
>         #display our results
>         commandline = "start cmd /C " + logTextFile
>         os.system(commandline)
> 
> Dean Gardner
> Test Engineer 
> Barco
> Bonnington Bond, 2 Anderson Place, Edinburgh EH6 5NP, UK
> Tel + 44 (0) 131 472 5731 Fax + 44 (0) 131 472 4799
> www.barco.com 
> [EMAIL PROTECTED] 
> 
> 
> -----Original Message-----
> From: Kent Johnson [mailto:[EMAIL PROTECTED] 
> Sent: 04 May 2007 11:26
> To: Gardner, Dean
> Cc: [email protected]
> Subject: Re: [Tutor] Text matching
> 
> Gardner, Dean wrote:
>>  
>> So here it is....it might not be pretty (it seems a bit un-python like
> 
>> to me) but it works exactly as required. If anyone can give any tips 
>> for possible optimisation or refactor I would be delighted to hear 
>> from them.
>>
>> Thanks
>>
>>        uid = self.item.Uid()
>>         record=[]
>>         logList=[]
>>         displayList=[]
>>         f = open(filename)
>>         logTextFile="temp.txt"
>>         """ searched through the changelog 'breaking' it up into
>>             individual entries"""
>>         try:
>>             while 1:
>>                 endofRecord=0
>>                 l = f.next()
>>                 if l.startswith("----"):
>>                     record.append(l)
>>                 l=f.next()
>>                 while endofRecord==0:
>>                     if "Reviewed: 000" not in l:
>>                         record.append(l)
>>                         l=f.next()
>>                     else:
>>                         logList.append(record)
>>                         record=[]
>>                         endofRecord=1
>>         except StopIteration:
>>             pass
> 
> I don't think you need endofRecord and the nested loops here. In fact I
> think you could use a plain for loop here. AFAICT all you are doing is
> accumulating records with no special handling for anything except the
> end records. What about this:
> record = []
> for line in f:
>    if "Reviewed: 000" in line:
>      logList.append(record)
>      record = []
>    else:
>      record.append(line)
> 
>>         """ searches to determine if we can find entries for
>>             a particualr item"""
>>         for record in logList:
>>             currRec = record
>>             for item in currRec:
>>                 if uid in item:
>>                     displayList.append(currRec)
> 
> The currRec variable is not needed, just use record directly.
> If uid can only be in a specific line of the record you can test that
> directly, e.g.
> for record in logList:
>    if uid in record[1]:
> 
>>         """ creates a temporary file to write our find results to """
>>         removeFile = os.path.normpath( os.path.join(os.getcwd(),
>> logTextFile))
>>
>>         # if the file exists, get rid of it before writing our new 
>> findings
>>         if Shared.config.Exists(removeFile):
>>             os.remove(removeFile)
>>         recordLog = open(logTextFile,"a")
>>
>>         for record in range(len(displayList)):
>>             for item in displayList[record]:
>>                 recordLog.write(item)
> 
> for record in displayList:
>    recordLog.writelines(record)
> 
>>         recordLog.close()
>>         #display our results
>>         commandline = "start cmd /C " + logTextFile
>>         os.system(commandline)
>>
> 
> Kent
> 
> 
> DISCLAIMER:
> Unless indicated otherwise, the information contained in this message is 
> privileged and confidential, and is intended only for the use of the 
> addressee(s) named above and others who have been specifically authorized to 
> receive it. If you are not the intended recipient, you are hereby notified 
> that any dissemination, distribution or copying of this message and/or 
> attachments is strictly prohibited. The company accepts no liability for any 
> damage caused by any virus transmitted by this email. Furthermore, the 
> company does not warrant a proper and complete transmission of this 
> information, nor does it accept liability for any delays. If you have 
> received this message in error, please contact the sender and delete the 
> message. Thank you.
> _______________________________________________
> Tutor maillist  -  [email protected]
> http://mail.python.org/mailman/listinfo/tutor
> 

_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to