2008-10-11 77 views
2

我在Excel文件(和csv文件)中有大量数据。数据需要放入数据库(mysql)。但是,在进入数据库之前,需要处理它。例如,如果列1小于列3,则将列4添加到列2.在信息持续存在之前,必须遵守相当多的规则。在数据库之前处理数据的应用程序设计

什么是一个好的设计来完成这项任务? (用java)

其他备注

流程需要被自动化。从某种意义上说,我不必手动进入和更改数据。我们正在谈论数千行数据,每行有15列信息。

目前,我有一种责任设计链的设置。每个规则的一个类(Java)。当一个规则完成时,它会调用以下规则。

更多信息

通常有每​​个数据片约5000行。速度不是一个巨大的问题,因为这个大的输入不经常发生。

我已经考虑过流口水,但是我不确定这个任务对于流程来说足够复杂。

实施例的规则:

  1. 所有货币(在特定列中的数据)不能包含货币符号。

  2. 类别名称必须一致(如书案=书柜)

  3. 入学日期不能是将来的日期

  4. 文本输入只能包含[AZ 0-9 \ s]的

等。
此外,如果任何一列信息无效,则需要在 处理完成时报告 (或者可能停止处理)。

我目前的解决方案工作。不过,我认为还有改进的空间,所以我正在寻找 的理想,以了解如何改进以及其他人如何处理类似 的情况。

我已经考虑过(非常简单地)使用口水,但我不确定工作是否足够复杂以利用流口水。

回答

1

如果我不在乎为此在1个阶段(奥利提到),我可能会使用一个pipe and filters设计。既然你的规则比较简单,我可能会做几个基于委托的类。例如(C#代码,但Java的应该是相当类似的...也许有人可以翻译?):

interface IFilter { 
    public IEnumerable<string> Filter(IEnumerable<string> file) { 
    } 
} 

class PredicateFilter : IFilter { 
    public PredicateFilter(Predicate<string> predicate) { } 

    public IEnumerable<string> Filter(IEnumerable<string> file) { 
     foreach (string s in file) { 
     if (this.Predicate(s)) { 
      yield return s; 
     } 
     } 
    } 
} 

class ActionFilter : IFilter { 
    public ActionFilter(Action<string> action) { } 

    public IEnumerable<string> Filter(IEnumerable<string> file) { 
     foreach (string s in file) { 
     this.Action(s); 
     yield return s; 
     } 
    } 
} 

class ReplaceFilter : IFilter { 
    public ReplaceFilter(Func<string, string> replace) { } 

    public IEnumerable<string> Filter(IEnumerable<string> file) { 
    foreach (string s in file) { 
     yield return this.Replace(s); 
    } 
    } 
} 

从那里,你可以直接使用委托的过滤器,或继承他们的具体细节。然后,将它们注册到将通过每个过滤器的管道。

0

每个规则的类? 真的吗?也许我不理解这些规则的数量和复杂性,但我会(半伪代码):

public class ALine { 
    private int col1; 
    private int col2; 
    private int coln; 
    // ... 

    public ALine(string line) { 
     // read row into private variables 
     // ... 

     this.Process(); 
     this.Insert(); 
    } 

    public void Process() { 
     // do all your rules here working with the local variables 
    } 

    public void Insert() { 
     // write to DB 
    } 
} 

foreach line in csv 
    new ALine(line); 
0

您使用类为每个规则听起来确实有点重重量的方法,但它有随着新规则的出现,易于修改和扩展的好处就会出现。

至于加载数据批量加载是要走的路。我已阅读了一些信息,表明它可能比使用插入语句加载速度快3个数量级。你可以找到它的一些信息here

0

将数据批量加载到临时表中,然后使用sql来应用您的规则。 使用临时表作为插入到真实表的基础。 删除临时表。

1

我认为你的方法是可以的。特别是如果你在每个处理器上使用相同的接口。

你也可以看看一些叫Drules的东西,目前是Jboss规则。我前一段时间用于我的应用程序的一个重要规则部分,我喜欢的是业务逻辑可以表达为例如电子表格或DSL,然后将其编译为java(运行时,我认为这是也是编译时选项)。它使规则更加灵活,从而可读。这也很容易学习(2天左右)。

这里有一个链接到开源Jboss-rules。在jboss.com上,如果这更符合你公司的口味,你无疑可以购买一个官方维护的版本。

0

你可以看到所有不同的答案都来自他们自己的经验和观点。

由于我们不太了解系统中行的复杂性和数量,因此我们倾向于根据之前的工作提供建议。

如果您想缩小为实施的1/2解决方案,请尝试提供更多详细信息。

好运

1

只需创建一个函数来执行每个规则,并为每个值调用每个适用的函数。我不明白这是如何需要任何异国情调的建筑。

0

它可能不是你想听到的,它不是以任何方式“有趣的方式”,但有一个更简单的方法来做到这一点。

只要您的数据逐行进行评估......您可以在您的Excel文件中设置另一个工作表并使用电子表格样式函数来执行必要的转换,从原始数据表引用数据。对于更复杂的函数,您可以使用嵌入在Excel中的vba写出自定义操作。

我已经多次使用这种方法,它的工作非常好,它只是不太性感。

相关问题