documents:etl:pentaho:pentaho-999
{
import java.io.*; import java.util.LinkedHashMap; import java.util.Map; // ファイル名のフィールドド名 String filecolumn = "filename"; // ファイルの項目構成 Map<String,Integer> collist = new LinkedHashMap<String,Integer>() { { put("COLUMN1",3); // 3バイト put("COLUMN2",2); // 2バイト put("COLUMN3",6); // 6バイト } }; boolean exitflag = false; int rowcounter = 0; String filename; public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { if (first) { exitflag = false; first = false; } Object[] r = getRow(); if (r == null) { setOutputDone(); return false; } // ファイル名取得フィールドからファイル名を得る filename = get(Fields.In, filecolumn).getString(r); // 指定斧ファイルから1レコードずつ切り出す try { InputStream input = new FileInputStream(filename); while(!exitflag) { rowcounter++; byte[] buffer; boolean safe = true; Object[] rec = createOutputRow(r, data.outputRowMeta.size()); // レコードのデータを設定 for(Map.Entry<String,Integer> item : collist.entrySet()) { int len = 0 + ((Integer)item.getValue()); try { buffer = input.readNBytes(len); } catch(IOException e) { input.close(); logError(String.format("rec %d : %s", rowcounter, e.getMessage()) ); setOutputDone(); return false; } if ((buffer.length <= 0)||(buffer.length < len)) { exitflag = true; safe = false; break; } // 項目をレコードのひな型に格納していく get(Fields.Out, ((String)item.getKey())).setValue(rec, buffer); } // 1レコード分読み取れたらレコードを書き出す if (safe) putRow(data.outputRowMeta, rec); } // 次レコードの準備 input.close(); rowcounter = 0; exitflag = false; } catch (IOException e) { logError(String.format("rec %d : %s", rowcounter, e.getMessage()) ); setOutputDone(); return false; } return true; }
documents/etl/pentaho/pentaho-999.txt · 最終更新: by k896951
