protected void assign(String line, int idx) {
		String vals[] = line.split(separator);

		// Populate values
		int maxFieldNum = Math.min(vals.length, fieldNames.length);
		for (int i = 0; i < maxFieldNum; i++) {
			// If the name of the field is empty => Skip this field
			if (!fieldNames[i].isEmpty()) {
				try {
					// Get array
					Field field = fieldByName.get(fieldNames[i]);
					Object array = field.get(this);

					// Get type
					String typeName = field.getType().getCanonicalName();

					// Get value
					Object value = null;
					String valOri = vals[i];
					if (typeName.equals("java.lang.String[]")) value = valOri;
					else {
						// Numeric values have to be trimmed
						String valTrim = valOri.trim();

						if (typeName.equals("int[]")) value = Gpr.parseIntSafe(valTrim);
						else if (typeName.equals("long[]")) value = Gpr.parseLongSafe(valTrim);
						else if (typeName.equals("double[]")) value = Gpr.parseDoubleSafe(valTrim);
						else if (typeName.equals("float[]")) value = Gpr.parseFloatSafe(valTrim);
						else if (typeName.equals("boolean[]")) value = Gpr.parseBoolSafe(valTrim);
						else throw new RuntimeException("Unsoported parsing for object type '" + typeName + "' cannot be parsed.");
					}

					// Assign: array[idx] = value
					Array.set(array, idx, value);

				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}
	}