--- /dev/null
+package tim.prune.load;
+
+/**
+ * Class responsible for splitting the file contents into an array
+ * based on the selected delimiter character
+ */
+public class FileSplitter
+{
+ private FileCacher _cacher = null;
+ private int _numRows = 0;
+ private int _numColumns = 0;
+ private boolean[] _columnStates = null;
+ private String[] _firstFullRow = null;
+
+
+ /**
+ * Constructor
+ * @param inCacher FileCacher object holding file contents
+ */
+ public FileSplitter(FileCacher inCacher)
+ {
+ _cacher = inCacher;
+ }
+
+ /**
+ * Split the FileCacher's contents into a 2d array
+ * @param inDelim delimiter character
+ * @return 2d Object array
+ */
+ public String[][] splitFieldData(char inDelim)
+ {
+ _firstFullRow = null;
+ if (_cacher == null) return null;
+ String[] contents = _cacher.getContents();
+ if (contents == null || contents.length == 0) return null;
+ String delimStr = checkDelimiter(inDelim);
+ // Count non-blank rows and max field count
+ _numRows = 0;
+ int maxFields = 0;
+ for (int i=0; i<contents.length; i++)
+ {
+ if (contents[i] != null && !contents[i].trim().equals(""))
+ {
+ _numRows++;
+ String[] splitLine = contents[i].split(delimStr);
+ if (splitLine != null && splitLine.length > maxFields)
+ {
+ maxFields = splitLine.length;
+ _firstFullRow = splitLine;
+ }
+ }
+ }
+ _numColumns = maxFields;
+ _columnStates = new boolean[maxFields];
+
+ // Create array and populate it
+ // Note that array will be rectangular even if data is ragged
+ String[][] result = new String[_numRows][];
+ for (int i=0; i<contents.length; i++)
+ {
+ result[i] = new String[maxFields];
+ if (contents[i] != null)
+ {
+ String wholeLine = contents[i];
+ if (!wholeLine.trim().equals(""))
+ {
+ // Don't use trimmed string here because you'll lose empty fields at beginning
+ // if separated by spaces or tabs
+ String[] splitLine = wholeLine.split(delimStr);
+ if (splitLine != null)
+ {
+ System.arraycopy(splitLine, 0, result[i], 0, splitLine.length);
+ // Check if columns are blank or not
+ for (int j=0; j<splitLine.length; j++)
+ {
+ if (!_columnStates[j] && splitLine[j].trim().length() > 0)
+ {
+ _columnStates[j] = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+
+ /**
+ * @return the number of rows in the data
+ */
+ public int getNumRows()
+ {
+ return _numRows;
+ }
+
+
+ /**
+ * @return the number of columns in the data
+ */
+ public int getNumColumns()
+ {
+ return _numColumns;
+ }
+
+ /**
+ * @return the fields in the first full row
+ */
+ public String[] getFirstFullRow()
+ {
+ return _firstFullRow;
+ }
+
+
+ /**
+ * Check if the specified column of the data is blank
+ * @param inColumnNum number of column, starting with 0
+ * @return true if no data exists in this column
+ */
+ public boolean isColumnBlank(int inColumnNum)
+ {
+ // Should probably trap out of range values
+ return !_columnStates[inColumnNum];
+ }
+
+ /**
+ * Check the delimiter for proper regular expression matching
+ * @param inDelim character selected as delimiter
+ * @return regular expression for splitting
+ */
+ private static String checkDelimiter(char inDelim)
+ {
+ String result = "" + inDelim;
+ // Don't pass asterisks or dots without escaping them for RE
+ if (inDelim == '*' || inDelim == '.') {
+ result = "\\" + result;
+ }
+ return result;
+ }
+}