PYTHON   10

ff2csv.py

Guest on 25th July 2021 04:59:14 PM

  1. #!/usr/bin/env python
  2. # -*- Python -*-
  3. """Transform find-fix.py output into Excellable csv."""
  4.  
  5. __date__ = "Time-stamp: <2003-10-16 13:26:27 jrepenning>"[13:30]
  6. __author__ = "Jack Repenning <jrepenning@collab.net>"
  7.  
  8. import getopt
  9. import inspect
  10. import os
  11. import os.path
  12. import pydoc
  13. import re
  14. import shutil
  15. import string
  16. import sys
  17. import time
  18.  
  19. # Long options and their usage strings; "=" means it takes an argument.
  20. # To get a list suitable for getopt.getopt(), just do
  21. #
  22. #   [x[0] for x in long_opts]
  23. #
  24. # Make sure to sacrifice a lamb to Guido for each element of the list.
  25. long_opts = [
  26.     ["doc",             """Optional, print pydocs."""],
  27.     ["help",            """Optional, print usage (this text)."""],
  28.     ["verbose",         """Optional, print more progress messages."""],
  29.     ]
  30.  
  31. help    = 0
  32. verbose = 0
  33. me = os.path.basename(sys.argv[0])
  34.  
  35. DATA_FILE = "http://subversion.tigris.org/iz-data/query-set-1.tsv"
  36.  
  37. def main():
  38.     """Run find-fix.py with arguments du jour for drawing pretty
  39. manager-speak pictures."""
  40.  
  41.     global verbose
  42.  
  43.     try:
  44.         opts, args = getopt.getopt(sys.argv[1:], "", [x[0] for x in long_opts])
  45.     except getopt.GetoptError, e:
  46.         print "Error: ", e.msg
  47.         shortusage()
  48.         print me + " --help for options."
  49.         sys.exit(1)
  50.  
  51.     for opt, arg in opts:
  52.         if opt == "--help":
  53.             usage()
  54.             sys.exit(0)
  55.         elif opt == "--verbose":
  56.             verbose = 1
  57.         elif opt == "--doc":
  58.             pydoc.doc(pydoc.importfile(sys.argv[0]))
  59.             sys.exit(0)
  60.  
  61.     # do something fruitful with your life
  62.     if len(args) == 0:
  63.         args = ["query-set-1.tsv", "core-history.csv"]
  64.         print ("ff2csv %s %s" % args)
  65.  
  66.     if len(args) != 2:
  67.         print "%s: Wrong number of args." % me
  68.         shortusage()
  69.         sys.exit(1)
  70.  
  71.     if os.system("curl " + DATA_FILE + "> " + args[0]):
  72.         os.system("wget " + DATA_FILE)
  73.  
  74.     outfile = file(args[1], "w")
  75.     outfile.write("Date,found,fixed,inval,dup,other,remain\n")
  76.  
  77.     totalsre = re.compile("totals:.*found= +([0-9]+) +"
  78.                           "fixed= +([0-9]+) +"
  79.                           "inval= +([0-9]+) +"
  80.                           "dup= +([0-9]+) +"
  81.                           "other= +([0-9]+) +"
  82.                           "remain= *([0-9]+)")
  83.     for year in ("2001", "2002", "2003", "2004"):
  84.         for month in ("01", "02", "03", "04", "05", "06", "07", "08",
  85.                       "09", "10", "11", "12"):
  86.             for dayrange in (("01", "08"),
  87.                              ("08", "15"),
  88.                              ("15", "22"),
  89.                              ("22", "28")):
  90.                 if verbose:
  91.                     print "searching %s-%s-%s to %s" % (year,
  92.                                                         month,
  93.                                                         dayrange[0],
  94.                                                         dayrange[1])
  95.                 ffpy = os.popen("python ./find-fix.py --m=beta "
  96.                                 "%s %s-%s-%s %s-%s-%s"
  97.                                 % (args[0],
  98.                                    year, month, dayrange[0],
  99.                                    year, month, dayrange[1]))
  100.                 if verbose:
  101.                     print "ffpy: ", ffpy
  102.  
  103.                 line = ffpy.readline()
  104.                 if verbose:
  105.                     print "initial line is: ", line
  106.                 matches = totalsre.search(line)
  107.                 if verbose:
  108.                     print "initial match is: ", matches
  109.                 while line and not matches:
  110.                     line = ffpy.readline()
  111.                     if verbose:
  112.                         print "%s: read line '%s'" % (me, line)
  113.                     matches = totalsre.search(line)
  114.                     if verbose:
  115.                         print "subsequent line is: ", line
  116.  
  117.                 ffpy.close()
  118.  
  119.                 if verbose:
  120.                     print "line is ", line
  121.  
  122.                 if matches.group(1) != "0" \
  123.                    or matches.group(2) != "0" \
  124.                    or matches.group(3) != "0" \
  125.                    or matches.group(4) != "0" \
  126.                    or matches.group(5) != "0":
  127.                    
  128.                     outfile.write("%s-%s-%s,%s,%s,%s,%s,%s,%s\n"
  129.                                   % (year, month, dayrange[1],
  130.                                      matches.group(1),
  131.                                      matches.group(2),
  132.                                      matches.group(3),
  133.                                      matches.group(4),
  134.                                      matches.group(5),
  135.                                      matches.group(6),
  136.                                      ))
  137.                 elif matches.group(6) != "0":
  138.                     # quit at first nothing-done week
  139.                     # allows slop in loop controls
  140.                     break
  141.     outfile.close()            
  142.    
  143.  
  144. def shortusage():
  145.   "Print one-line usage summary."
  146.   print "%s - %s" % (me, pydoc.synopsis(sys.argv[0]))
  147.  
  148. def usage():
  149.   "Print multi-line usage tome."
  150.   shortusage()
  151.   print '''%s [opts] [queryfile [outfile]]
  152. Option keywords may be abbreviated to any unique prefix.
  153. Option order is not important.
  154. Most options require "=xxx" arguments:''' % me
  155.   for x in long_opts:
  156.       padding_limit = 18
  157.       if x[0][-1:] == '=':
  158.           print "   --" + x[0][:-1],
  159.           padding_limit = 19
  160.       else:
  161.           print "   --" + x[0],
  162.       print (' ' * (padding_limit - len(x[0]))), x[1]
  163.  
  164. if __name__ == "__main__":
  165.   main()

Raw Paste


Login or Register to edit or fork this paste. It's free.