基本上,我必须将一个平面文件放入数据库中。平面文件带有每行的前两个字符,表示它是哪种类型的记录。
我是否为每种记录类型创建一个类,其属性与记录中的字段匹配?我应该只使用数组吗?
我希望在将数据保存到数据库之前将数据加载到某种数据结构中,以便我可以使用单元测试来验证数据是否已正确加载。
以下是我必须使用的样本(BAI2银行对账单):
01,121000358,CLIENT,050312,0213,1,80,1,2/
02,CLIENT-STANDARD,BOFAGB22,1,050311,2359,,/
03,600812345678,GBP,fab1,111319005,,V,050314,0000/
88,fab2,113781251,,V,050315,0000,fab3,113781251,,V,050316,0000/
88,fab4,113781251,,V,050317,0000,fab5,113781251,,V,050318,0000/
88,010,0,,,015,0,,,045,0,,,100,302982205,,,400,302982205,,/
16,169,57626223,V,050311,0000,102 0101857345,/
88,LLOYDS TSB BANK PL 779300 99129797
88,TRF/REF 6008ABS12300015439
88,102 0101857345 K BANK GIRO CREDIT
88,/IVD-11 MAR
49,1778372829,90/
98,1778372839,1,91/
99,1778372839,1,92
答案 0 :(得分:1)
我建议创建类(或结构,或语言支持的任何值类型),
record.ClientReference
比
更具描述性record[0]
并且,如果您正在使用(精彩!)FileHelpers Library,那么您的条款几乎都是由您决定的。
答案 1 :(得分:1)
验证逻辑通常至少有2个级别,更大的级别是“格式良好”,更精细的级别是“正确的数据”。
这里有一些不同的问题。一个问题是简单地验证数据,或编写测试以确保您的解析是准确的。执行此操作的一种简单方法是解析为接受给定值范围的类,如果不是,则抛出相应的错误, 例如
public void setField1(int i) { if(i> 100)抛出新的InvalidDataException ... }
如果解析逻辑对于不同的代码有很大不同,那么您可能希望为每种记录类型创建不同的类,因此您没有条件逻辑,如
public void setField2(String s)
{
if (field1==88 && s.equals ...
else if (field2==22 && s
}
yechh。
答案 2 :(得分:0)
当我不得不在过去加载这种数据时,我已将它全部放入一个工作表中,其中前两个字符在一个字段中,其余字符在另一个字段中。然后我根据前两个字符将其解析为适当的其他工作表。然后,在将第二组工作表中的数据插入数据库之前,我已经完成了任何清理和验证。
在SQL Server中,您可以通过DTS(2000)或SSIS包并使用SSIS执行此操作,您可以先将数据存储在工作表中,但是可以轻松处理数据,使用第一个确定要使用的数据流分支的两个字符,然后将剩余的记录解析为某种类型的保持机制,然后在插入之前进行清理和验证。我确信其他数据库也有某种类型的导入数据的机制,并且会使用一个简单的过程。
答案 3 :(得分:0)
我同意,如果您的数据格式有任何复杂性,您应该创建一组自定义类来解析和保存数据,执行验证,并执行任何其他适当的模型任务(例如,返回一个人类可读的描述,虽然有人会说这会更好地放入一个单独的视图类)。使用继承可能是一个很好的情况,你有一个父类(可能是抽象的)定义所有类型的记录共有的属性和方法,每个子类可以覆盖这些方法,以便在必要时提供自己的解析和验证,或添加自己的属性和方法。
答案 4 :(得分:0)
为每种类型的行创建一个类比使用Arrays更好。
然而,在过去,我曾使用Hashtables的Arraylists来完成同样的事情。 arraylist中的每个项目都是一行,哈希表中的每个条目都是表示列名和单元格值的键/值对。
答案 5 :(得分:0)
为什么不从设计保存数据的数据库开始,然后就可以使用实体框架为您生成类。
答案 6 :(得分:0)
这是一个古怪的想法:
如果您在Perl中工作,则可以使用DBD::CSV从平面文件中读取数据,前提是您为分隔符和EOL字符指定了正确的值。然后,您将通过SQL语句从平面文件中读取行; DBI将为您提供标准的Perl数据结构,您可以运行任何您喜欢的验证逻辑。一旦每行通过所有验证测试,您就可以使用DBD :: whatever将其写入目标数据库。
-Steve