docs: def tabular_extractor(self, table_str: str = None, filename: str = None,
                            file_content=None,
                            file_type=None,
                            sheet_name: str = None,
                            dataset: str = None,
                            nested_key: str = None,
                            doc_id_field: str = None,
                            encoding=None) -> List[Document]:
          """
          Read the input file/content and return a list of Document(s)
          Args:
              table_str: use this parameter, if you are 100% sure that the content is a csv
              filename: use this parameter if the file extension is one of tab, csv, tsv, xls, xlsx
              file_content: if the input has some arbitrary extension, read it yourself and pass the contents along
              file_type: use this parameter with file_content, can be tsv, csv, etc
              sheet_name: sheet name as in xls or xlsx files
              dataset: user provided string to be added to output Document(s)
              nested_key: user provided string to be added to output Document(s)
              doc_id_field: specify this field(should be present in the input file), its value will be used as doc_id
  
          Returns: List[Document]
  
          """
          data = list()
  
          if table_str is not None and filename is not None:
              raise InvalidArgumentsError(message="for arguments 'table_str' and 'filename', please specify only one "
                                                  "argument!")
  
          elif table_str is not None:
              f = StringIO(table_str)
              reader = csv.reader(f, delimiter=',')
              for row in reader:
                  data.append(row)
          elif filename is not None:
              # always read the entire file first
              fn, extension = os.path.splitext(filename)
              extension = extension.lower()
  
              if extension in self._get_data_function:
                  get_data = self._get_data_function[extension]
              else:
                  # in pyexcel we trust
                  # if there is an extension we have not mapped, just let pyexcel figure it out
                  get_data = pyexcel_io.get_data
  
              try:
                  if file_content and file_type:
                      data = get_data(file_content, file_type=file_type, auto_detect_datetime=False,
                                      auto_detect_float=False, encoding=encoding if encoding else "utf-8")
                  else:
                      data = get_data(filename, auto_detect_datetime=False,
                                      auto_detect_float=False, encoding=encoding if encoding else "utf-8")
              except:
                  try:
                      data = get_data(filename, auto_detect_datetime=False,
                                      auto_detect_float=False, encoding="latin_1")
                  except:
                      data = get_data(filename, auto_detect_datetime=False,
                                      auto_detect_float=False, encoding="utf-8-sig")
  
              if extension == '.xls' or extension == '.xlsx':
                  if sheet_name is None:
                      sheet_name = list(data.keys())[0]
  
                  data = data[sheet_name]
              else:
                  data = data[file_type] if file_type else data[fn.split('/')[-1] + extension]
  
          table_content, heading = self.content_recognizer(data)
  
          return self.create_documents(rows=table_content,
                                       heading=heading,
                                       file_name=filename,
                                       dataset=dataset,
                                       nested_key=nested_key,
                                       doc_id_field=doc_id_field)