Pergunta

Essencialmente, eu tenho que pegar um arquivo simples em um banco de dados. Os arquivos simples entrar com os dois primeiros caracteres em cada linha que indica qual tipo de registro é.

Do I criar uma classe para cada tipo de registro com propriedades que correspondem aos campos no registro? Devo apenas usar matrizes?

Eu quero carregar os dados em algum tipo de estrutura de dados antes de salvá-lo no banco de dados para que eu possa usar testes de unidade para verificar se os dados foram carregados corretamente.

Aqui está uma amostra do que eu tenho que trabalhar com (extratos bancários 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
Foi útil?

Solução

Eu recomendo a criação de classes (ou estruturas, ou valor que-nunca tipo seus apoios de linguagem), como

record.ClientReference

é muito mais descritivo do que

record[0]

e, se você estiver usando o (maravilhoso!) FileHelpers Biblioteca , em seguida, seus termos são bastante muito ditada para você.

Outras dicas

lógica de validação normalmente tem pelo menos 2 níveis, o mais grosseiro nível estar "bem formatado" e o nível mais fina sendo "dados corretos".

Existem alguns problemas distintos aqui. Uma questão é a de simplesmente verificar os dados, ou escrever testes para se certificar de que a sua análise é preciso. Uma simples maneira de fazer isso é analisar em uma classe que aceita um determinado intervalo de valores, e lança o erro apropriada se não, por exemplo.

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

Criação de classes diferentes para cada tipo de registro é algo que você pode querer fazer se a lógica de análise é significativamente diferente de códigos diferentes, assim você não tem lógica condicional como

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

         else if (field2==22 && s 
   }

yechh.

Quando eu tive que carregar este tipo de dados no passado, eu colocar tudo em uma mesa de trabalho com os dois primeiros caracteres em um campo eo restante em outro. Então eu ter analisado-lo para as outras mesas de trabalho adequadas com base nos dois primeiros caracteres. Então eu ter feito qualquer limpeza e validação antes de inserir os dados do segundo conjunto de mesas de trabalho no banco de dados.

No SQL Server você pode fazer isso através de um DTS (2000) ou um pacote SSIS e usando SSIS, você pode ser capaz de processar os dados Onthe voar com armazenamento em mesas de trabalho em primeiro lugar, mas o prcess é smilar, use o primeiro dois caracteres para determinar o ramo de fluxo de dados para o uso, em seguida, analisar o resto do registo em algum tipo de mecanismo e para cima, em seguida, limpo e validar de exploração antes de inserir. Tenho certeza de que outros bancos de dados também têm algum tipo de mecanismo para a importação de dados e usaria um processo simliar.

Eu concordo que se o seu formato de dados tem qualquer tipo de complexidade que você deve criar um conjunto de classes personalizadas para analisar e armazenar os dados, executar a validação, e fazer quaisquer outras tarefas modelo apropriado (por exemplo, retornar uma descrição legível, embora alguns irão argumentar que isso seria melhor para colocar em uma classe vista separado). Este seria provavelmente uma boa situação para herança uso, onde você tem uma classe pai (possivelmente abstrato) definir a propriedades e métodos comuns a todos os tipos de registros, e cada classe criança pode substituir esses métodos para fornecer a sua própria análise e validação se necessário , ou adicionar suas próprias propriedades e métodos.

A criação de uma classe para cada tipo de linha seria uma solução melhor do que usar Arrays.

Dito isto, no entanto, no passado, eu usei ArrayLists de Hashtables para realizar a mesma coisa. Cada item na ArrayList é uma fila, e cada entrada na tabela hash é um par chave / valor que representa o nome da coluna e valor da célula.

Por que não começar por projetar o banco de dados que irá armazenar os dados, em seguida, você pode usar o framwork entidade para gerar as classes para você.

aqui é uma idéia maluca:

Se você estava trabalhando em Perl, você poderia usar DBD :: CSV para ler dados do seu arquivo simples, desde que você deu-lhe os valores corretos para o separador e caracteres de fim de linha. você iria em seguida, ler linhas do arquivo plano por meio de instruções SQL; DBI irá transformá-los em estruturas de dados Perl padrão para você, e você pode executar qualquer lógica de validação você gosta. uma vez que cada linha passa todos os testes de validação, você seria capaz de escrevê-lo no banco de dados de destino usando DBD :: o que quer.

-Steve

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top