我在 CSV 文件中有可用的数据。每个 CSV 都与另一个不同,即列名不同。例如,在 FileA 中唯一的标识符称为 ID,但在 FileB 中称为 UID。同样,在 FileA 中金额称为 AMT,但在 FileB 中称为 CUST_AMT。含义相同,但列名不同。
我想创建一个通用解决方案,将这些不同的数据从 CSV 文件保存到数据库表中。该解决方案必须考虑将来可能出现的其他格式。
这种情况有没有最好的方法?
我在 CSV 文件中有可用的数据。每个 CSV 都与另一个不同,即列名不同。例如,在 FileA 中唯一的标识符称为 ID,但在 FileB 中称为 UID。同样,在 FileA 中金额称为 AMT,但在 FileB 中称为 CUST_AMT。含义相同,但列名不同。
我想创建一个通用解决方案,将这些不同的数据从 CSV 文件保存到数据库表中。该解决方案必须考虑将来可能出现的其他格式。
这种情况有没有最好的方法?
这个问题有很多解决方案。但我认为最简单的可能是生成从每个输入文件格式到组合行格式的映射。您可以创建一个具有列名到数据库字段名映射的配置文件,并创建一个程序,在给定 CSV 和映射文件的情况下,可以将所有数据插入数据库。
但是,您仍然必须为要添加的每个新列更改表。
更多的设计工作需要更多关于数据进入数据库后如何使用的细节。
我可以在执行开始时想到“责任链”模式。因此,您阅读标题并让责任链为该文件获取适当的解析器。
代码可能如下所示:
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 对象来添加新的文件格式。
您将首先按如下方式初始化链:
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));