我在CSV文件中可以获得数据。每个CSV与另一个不同,即列名不同。例如,在FileA中,唯一标识符称为ID,但在FileB中称为UID。类似地,在FileA中,数量称为AMT,但在FileB中,它被称为CUST_AMT。含义相同,但列名不同。
我想创建一个通用解决方案,将CSV文件中的这些变化数据保存到数据库表中。解决方案必须考虑将来可能提供的其他格式。
这种情况有最好的方法吗?
答案 0 :(得分:0)
这个问题有很多解决方案。但我认为最简单的方法是生成从每种输入文件格式到组合行格式的映射。您可以创建一个具有列名到数据库字段名称映射的配置文件,并创建一个程序,给定CSV和映射文件,可以将所有数据插入到数据库中。
但是,您仍然需要为要添加的每个新列更改表。
更多设计工作需要有关数据进入数据库后如何使用的更多详细信息。
答案 1 :(得分:0)
我可以在执行开始时想到“责任链”模式。因此,您阅读标题并让责任链获得该文件的相应解析器。
代码可能如下所示:
interface Parser {
// returns true if this parser recognizes this format.
boolean accept(String fileHeader);
// Each parser can convert a line in the file into insert parameters to be
// used with PreparedStatement
Object[] getInsertParameters(String row);
}
这允许您通过向链添加新的Parser对象来添加新的文件格式。
您首先要按如下方式初始化Chain:
List<Parser> parserChain = new ArrayList<Parser>();
parserChain.add(new ParserImplA());
parserChain.add(new ParserImplB());
parserChain.add(new ParserImplB());
....
然后你将按如下方式使用它:
// read the header row from file
Parser getParser (String header) {
for (Parser parser: parserChain) {
if (parser.accept(header)
return parser;
}
throw new Exception("Unrecognized format!");
}
然后,您可以创建一个用于在表中插入行的预准备语句。 处理每一行文件将是:
preparedStatement.execute(parser.getInsertParameters(row));