code: protected Object[] extractHeaderNamesAndValues(String headersMap, String rowDelimiter, String columnDelimiter)
              throws Exception {
          String[] rows = headersMap.split(Pattern.quote(rowDelimiter));
          ArrayList<String> headerNames = new ArrayList<>();
          ArrayList<String> headerValues = new ArrayList<>();
          for (int i = 0; i < rows.length; i++) {
              if (isEmpty(rows[i])) {
                  continue;
              } else {
                  if (validateRow(rows[i], columnDelimiter, i)) {
                      String[] headerNameAndValue = rows[i].split(Pattern.quote(columnDelimiter));
                      headerNames.add(i, headerNameAndValue[0].trim());
                      headerValues.add(i, headerNameAndValue[1].trim());
                  }
              }
          }
          return new Object[]{headerNames, headerValues};
      }
docs: This method extracts and returns an object containing two Lists. A list with the header names and a list with the
  header values. Values found on same position in the two lists correspond to each other.
  @param headersMap
  @param rowDelimiter
  @param columnDelimiter
  @return
  @throws Exception