代码之家  ›  专栏  ›  技术社区  ›  Jim

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

  •  3
  • Jim  · 技术社区  · 16 年前

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

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

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

    以下是我必须使用的示例(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 回复  |  直到 16 年前
        1
  •  1
  •   kÍ©eÍ£mÍ®pÍ¥ Í©    16 年前

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

    record.ClientReference
    

    record[0]
    

    FileHelpers Library ,那么你的条件基本上是由你决定的。

        2
  •  1
  •   Steve B.    16 年前

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

    这里有几个独立的问题。一个问题是简单地验证数据,或者编写测试以确保解析的准确性。如果给定的解析方式不接受该类的值, 例如

    公共无效集合字段1(int i) 如果(i>100)抛出新的InvalidDataException。。。 }

       public void setField2(String s)
       {
             if (field1==88 && s.equals ...
    
             else if (field2==22 && s 
       }
    

    是的。

        3
  •  0
  •   HLGEM    16 年前

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

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

        4
  •  0
  •   Marc Charbonneau    16 年前

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

        5
  •  0
  •   Winston Smith    16 年前

    不过,也就是说,在过去我使用哈希表的ArrayList来完成同样的事情。arraylist中的每一项都是一行,哈希表中的每一项都是表示列名和单元格值的键/值对。

        6
  •  0
  •   matthew thomas matthew thomas    16 年前

    为什么不先设计一个保存数据的数据库,然后使用实体框架为您生成类呢。

        7
  •  0
  •   hakamadare    16 年前

    这里有一个古怪的想法:

    如果您使用的是Perl,那么可以使用 DBD::CSV

    -史蒂夫