我有以下输入:
输出会返回给我一个有错误的记录列表。因此,如果列应该是一个日期,但我给出了错误的格式。我会返回那些行。
csv文件是这样的:
inp.upper() == capitals[rand].upper()
元数据:
first_name,last_name,dob,age,
john,doe,2001/05/02
mary,jane,1968/04/01
我想知道战略模式是否是正确的选择。我正在考虑根据文件注入正确的语法(元数据)。我有多个要验证的文件。
答案 0 :(得分:0)
此问题需要验证处理程序(用于语法规则)。考虑到较低的复杂性级别和预期的扩展,我觉得不需要任何特定的设计模式。我建议遵循简单的面向对象方法。或者,根据预期的动态行为,可以通过将每个混凝土处理器放入链(COR)中来合并COR。将每个令牌传递到一个链中,以便为链中的处理程序提供机会,直到它被处理完毕。
public class Extractor {
public static void main(String[] args) {
// PREPARE TEMP_MAP_HANDLERS<Type,Handler>
Map<String, Handler> handlers = new HashMap<>();
handlers.put("FIRST_NAME",new NAMEHandler());
handlers.put("LAST_NAME",new NAMEHandler());
handlers.put("DOB",new DOBHandler());
handlers.put("AGE",new AGEHandler());
// READ THE HEADER
String header = "first_name,last_name,dob,age";// SAMPLE READ HEADER
// PREPARE LOOKUP<COL_INDEX, TYPE_HANDLER>
Map<Integer, Handler> metaHandlers = new HashMap<>();
String[] headerTokens = header.split(",");
for (int i = 0; i < headerTokens.length; i++) {
metaHandlers.put(i, handlers.get(headerTokens[i].toUpperCase()));
}
// DONE WITH TEMP HANDLER LOOKUP
// READ ACTUAL ROWS
// FOR EACH ROW IN FILE
String row = "joh*n,doe,2001/05/02";
String[] rowTokens = row.split(",");
for (int i = 0; i < rowTokens.length;i++) {
System.out.println(rowTokens[i]);
Handler handler = metaHandlers.get(i);
if (!handler.validate(rowTokens[i])){
// REPORT WRONG DATA
System.out.println("Wrong Token" + rowTokens[i]);
}
}
}
}
abstract class Handler {
abstract boolean validate (String field);
}
class NAMEHandler extends Handler{
@Override
boolean validate(String field) {
// Arbitrary rule - name should not contain *
return !field.contains("*");
}
}
class DOBHandler extends Handler{
@Override
boolean validate(String field) {
// Arbitrary rule - contains /
return field.contains("/");
}
}
class AGEHandler extends Handler{
@Override
boolean validate(String field) {
// TODO validate AGE
return true;
}
}