平面文件处理的适当数据结构?

时间:2008-11-20 15:34:27

标签: data-structures flat-file

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

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

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

以下是我必须使用的样本(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

7 个答案:

答案 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