{"record":{"id":"08ea5efa1492d703","repo":"pentaho/pentaho-kettle","slug":"gpload-exception-delimitermissing-gploaddataoutput","errorCode":null,"errorMessage":"GPload.Exception.DelimiterMissing","messagePattern":"GPload\\.Exception\\.DelimiterMissing","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/gpload/core/src/main/java/org/pentaho/di/trans/steps/gpload/GPLoadDataOutput.java","lineNumber":145,"sourceCode":"\n    Const.repl( buf, enclosure, enclosure + enclosure );\n    return buf.toString();\n  }\n\n  public void writeLine( RowMetaInterface mi, Object[] row ) throws KettleException {\n    if ( first ) {\n      first = false;\n\n      enclosure = meta.getEnclosure();\n      if ( enclosure == null ) {\n        enclosure = \"\";\n      } else {\n        enclosure = gpLoad.environmentSubstitute( enclosure );\n      }\n\n      delimiter = meta.getDelimiter();\n      if ( delimiter == null ) {\n        throw new KettleException( BaseMessages.getString( PKG, \"GPload.Exception.DelimiterMissing\" ) );\n      } else {\n        delimiter = gpLoad.environmentSubstitute( delimiter );\n        if ( Utils.isEmpty( delimiter ) ) {\n          throw new KettleException( BaseMessages.getString( PKG, \"GPload.Exception.DelimiterMissing\" ) );\n        }\n      }\n\n      // Setup up the fields we need to take for each of the rows\n      // as this speeds up processing.\n      fieldNumbers = new int[meta.getFieldStream().length];\n      for ( int i = 0; i < fieldNumbers.length; i++ ) {\n        fieldNumbers[i] = mi.indexOfValue( meta.getFieldStream()[i] );\n        if ( fieldNumbers[i] < 0 ) {\n          throw new KettleException( BaseMessages.getString( PKG, \"GPLoadDataOutput.Exception.FieldNotFound\", meta\n              .getFieldStream()[i] ) );\n        }\n      }\n","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/gpload/core/src/main/java/org/pentaho/di/trans/steps/gpload/GPLoadDataOutput.java#L127-L163","documentation":"writeLine() reads the delimiter from step metadata; if meta.getDelimiter() returns null it throws this KettleException. The delimiter is required to separate fields in the gpload data file, so writing cannot proceed without it.","triggerScenarios":"writeLine (via testWritiLine / normal row processing) executes while the GPload step metadata has no delimiter configured — getDelimiter() returns null.","commonSituations":"Step saved via a hand-edited ktr or repository where the delimiter attribute is absent; a dialog bug/older metadata format that never wrote the delimiter; someone cleared the delimiter field in the UI and saved.","solutions":["Open the GPload step dialog and set the delimiter (e.g. a comma or tab) before running","Fix the <delimiter> element in the .ktr XML to a concrete value","If the delimiter is variable-based, ensure it resolves non-empty (see 3064) and at minimum is non-null","Recreate the step with valid settings if metadata came from an incompatible PDI version"],"exampleFix":"// before (ktr XML)\n<delimiter/>\n// after\n<delimiter>,</delimiter>","handlingStrategy":"validation","validationCode":"if (meta.getDelimiter() == null || meta.getDelimiter().isEmpty()) {\n  throw new IllegalStateException(\"GPload delimiter must be configured, e.g. ',' or '\\\\t'\");\n}","typeGuard":"boolean hasDelimiter(GPLoadMeta m) { return m.getDelimiter() != null && !m.getDelimiter().isEmpty(); }","tryCatchPattern":"try { ... } catch (KettleException e) { if (e.getMessage().contains(\"DelimiterMissing\")) { /* set default delimiter and re-init */ } else throw e; }","preventionTips":["Always set a delimiter when creating the GPload step — never leave it blank","Avoid hand-editing .ktr XML; edit steps through the Spoon dialog","Re-save GPload steps after PDI upgrades to regenerate metadata","Validate step settings in a pre-run check hook"],"tags":["kettle","pdi","delimiter","configuration"],"backgroundTag":"empty-required-field","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}