3

本质上,我必须将平面文件放入数据库。平面文件的每行前两个字符指示它是哪种类型的记录。

我是否为每个记录类型创建一个类,其属性与记录中的字段匹配?我应该只使用数组吗?

我想在将数据保存到数据库之前将数据加载到某种数据结构中,以便我可以使用单元测试来验证数据是否正确加载。

这是我必须使用的示例(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
4

7 回答 7

1

我建议创建类(或结构,或您的语言支持的任何值类型),如

record.ClientReference

record[0]

而且,如果您使用的是(很棒的!)FileHelpers Library,那么您的条款几乎是为您规定的。

于 2008-11-20T15:38:55.183 回答
1

验证逻辑通常至少有 2 个级别,较粗的级别是“格式良好的”,而较细的级别是“正确的数据”。

这里有几个单独的问题。一个问题是简单地验证数据,或编写测试以确保您的解析是准确的。一个简单的方法是解析成一个接受给定范围值的类,如果不是,则抛出适当的错误,例如

public void setField1(int i) { if (i>100) throw new InvalidDataException... }

如果不同代码的解析逻辑显着不同,那么您可能需要为每种记录类型创建不同的类,因此您没有像这样的条件逻辑

   public void setField2(String s)
   {
         if (field1==88 && s.equals ...

         else if (field2==22 && s 
   }

耶赫。

于 2008-11-20T15:47:43.933 回答
0

过去当我不得不加载此类数据时,我将它们全部放入工作表中,前两个字符在一个字段中,其余字符在另一个字段中。然后我根据前两个字符将其解析为适当的其他工作表。然后我在将第二组工作表中的数据插入数据库之前进行了任何清理和验证。

在 SQL Server 中,您可以通过 DTS (2000) 或 SSIS 包并使用 SSIS 来执行此操作,您可以先存储在工作表中来动态处理数据,但过程很简单,使用前两个字符确定要使用的数据流分支,然后将记录的其余部分解析为某种类型的保存机制,然后在插入之前进行清理和验证。我确信其他数据库也有某种类型的数据导入机制,并且会使用类似的过程。

于 2008-11-20T15:55:32.387 回答
0

我同意,如果您的数据格式有任何复杂性,您应该创建一组自定义类来解析和保存数据、执行验证并执行任何其他适当的模型任务(例如,返回人类可读的描述,尽管有些会认为这会更好地放入单独的视图类中)。这可能是使用继承的好情况,您有一个父类(可能是抽象的)定义所有类型记录共有的属性和方法,并且每个子类可以覆盖这些方法以在必要时提供自己的解析和验证,或者添加自己的属性和方法。

于 2008-11-20T16:02:04.200 回答
0

为每种类型的行创建一个类将是比使用数组更好的解决方案。

然而,这就是说,在过去我使用 Hashtables 的 Arraylists 来完成同样的事情。arraylist 中的每一项都是一行,hashtable 中的每一项都是一个键/值对,表示列名和单元格值。

于 2008-11-20T16:09:28.863 回答
0

为什么不从设计将保存数据的数据库开始,然后您可以使用实体框架为您生成类。

于 2008-11-20T16:52:52.413 回答
0

这是一个古怪的想法:

如果您在 Perl 中工作,则可以使用DBD::CSV从平面文件中读取数据,前提是您为其提供了正确的分隔符和 EOL 字符值。然后,您将通过 SQL 语句从平面文件中读取行;DBI 将为您将它们变成标准的 Perl 数据结构,并且您可以运行任何您喜欢的验证逻辑。一旦每一行都通过了所有验证测试,您就可以使用 DBD::whatever 将其写入目标数据库。

-史蒂夫

于 2008-11-20T18:50:25.967 回答