forked from terrywbrady/File-Analyzer
-
Notifications
You must be signed in to change notification settings - Fork 11
File Import rule
Terry Brady edited this page Jan 15, 2014
·
10 revisions
File Import Rules act on a single file at one time. A File Import Rule generally reports on the status of each record that is found within a given file.
The File Analyzer Tool walks a directory tree and performs a "File Test" on each file that is encountered. The application framework allows new File Tests to be quickly developed and deployed into the application. The results of each File Test are compiled into a table that summarizes the results of the analysis.
##Components of a File Import Rule
public classclass CountKey extends DefaultImporter {
public String toString() {
return "Count Key";
}
public String getDescription() {
return "Count the number of times a key appears in a file.";
}
public String getShortName() {
return "Key";
}
public static final String DELIM = "Delimiter";
public static final String HEADROW = "HeadRow";
public static final String COL = "COL";
public CountKey(FTDriver dt) {
super(dt);
this.ftprops.add(new FTPropEnum(dt, this.getClass().getName(), DELIM, "delim",
"Delimiter character separating fields", Separator.values(), Separator.Comma));
this.ftprops.add(new FTPropEnum(dt, this.getClass().getName(), HEADROW, HEADROW,
"Treat first row as header", YN.values(), YN.Y));
this.ftprops.add(new FTPropString(dt, this.getClass().getName(), COL, COL,
"Key Column starting at 1", "1"));
}
public static enum MULT {ONE, MANY;}
private static enum CountStatsItems implements StatsItemEnum {
Key(StatsItem.makeStringStatsItem("Key", 100)),
Count(StatsItem.makeIntStatsItem("Count")),
Stat(StatsItem.makeEnumStatsItem(MULT.class, "Multiple?"))
;
StatsItem si;
CountStatsItems(StatsItem si) {this.si=si;}
public StatsItem si() {return si;}
}
public static enum Generator implements StatsGenerator {
INSTANCE;
public Stats create(String key) {return new Stats(details, key);}
}
public static StatsItemConfig details = StatsItemConfig.create(CountStatsItems.class);
In the example displayed above, a checksum is generated on the file using the algorithm provided by the user.
public ActionResult importFile(File selectedFile) throws IOException {
int col = 0;
try {
col = Integer.parseInt(this.getProperty(COL,"").toString());
col--;
} catch (NumberFormatException e) {
}
Separator fileSeparator = (Separator)getProperty(DELIM);
Timer timer = new Timer();
TreeMap<String,Stats> types = new TreeMap<String,Stats>();
DelimitedFileReader dfr = new DelimitedFileReader(selectedFile, fileSeparator.separator);
boolean firstRow = (YN)getProperty(HEADROW) == YN.Y;
firstRow = (YN)getProperty(HEADROW) == YN.Y;
dfr = new DelimitedFileReader(selectedFile, fileSeparator.separator);
for(Vector<String> cols = dfr.getRow(); cols != null; cols = dfr.getRow()){
if (firstRow) {
firstRow = false;
continue;
}
String key = cols.get(col < cols.size() ? col : 0);
Stats stats = types.get(key);
if (stats == null) {
stats = Generator.INSTANCE.create(key);
stats.setVal(CountStatsItems.Count, 1);
stats.setVal(CountStatsItems.Stat, MULT.ONE);
types.put(key, stats);
} else {
stats.sumVal(CountStatsItems.Count, 1);
stats.setVal(CountStatsItems.Stat, MULT.MANY);
}
}
return new ActionResult(selectedFile, selectedFile.getName(), this.toString(), details, types, true, timer.getDuration());
}
public class ImporterRegistry extends Vector<Importer> {
private static final long serialVersionUID = 1L;
public ImporterRegistry(FTDriver dt) {
...
add(new CountKey(dt));
}