docs: def parse(self):
          """Parse our data file and return a :class:`DatFile` or raise :exc:`ParseException`."""
          log.debug("Parsing Compass .DAT file %s ...", self.datfilename)
          datobj = DatFile(name_from_filename(self.datfilename), filename=self.datfilename)
  
          with codecs.open(self.datfilename, 'rb', 'windows-1252') as datfile:
              full_contents = datfile.read()
              survey_strs = [survey_str.strip() for survey_str in full_contents.split('\x0C')]
  
              if survey_strs[-1] == '\x1A':
                  survey_strs.pop()  # Compass may place a "soft EOF" with ASCII SUB char
  
              log.debug("Parsed %d raw surveys from Compass .DAT file %s.", len(survey_strs), self.datfilename)
              for survey_str in survey_strs:
                  if not survey_str:
                      continue
                  survey = CompassSurveyParser(survey_str).parse()
                  datobj.add_survey(survey)
  
          return datobj