5
respostas

Populando banco com arquivo (.txt) separado por pipe

Meus caros,

Tenho um arquivo (.txt) com a estrutura abaixo separado por "|" e quero popular um banco separado com tabelas para cada registro.

Criei uma tabela para cada registro, ou seja, quando a linha começa com "00000" é um registro com um tipo de informação, quando a linha começa com "01000" é um outro registro, mas que se refere ao mesmo grupo de informação do primeiro registro.

Nos dados abaixo vocês podem ver que o primeiro grupo começa com "00000" e finaliza com "99999" e isto acontece para cada grupo de informação, portanto entre "00000" e "99999" as tabelas devem ser ligadas pelo através do id.

Espero que tenham entendido, agradeço por me ajudar! este é o meu primeiro projeto e já tentei de algumas formas, mas sem sucesso até o momento!

00000|12234567201412001|01071500200256329|09039162752646502519|20150102105855|Versao: 1.5.8.0|12234567000110|P,SERVICOS J,F, LTDA - ME|4647|S|20070802|201412|2520,00|0,000|1,00|A|0||2520,00|0,00 01000|01071500200256612|151,20|0,00|0,00|151,20|20150120|20150120|151,20 01500|201301|3450,00 01501|201301|3450,00 01502|201301|0,00 01500|201302|3078,00 01501|201302|3078,00 01502|201302|0,00 01500|201303|2025,51 01501|201303|2025,51 01502|201303|0,00 01500|201304|3300,00 01501|201304|3300,00 01502|201304|0,00 01500|201305|3450,00 01501|201305|3450,00 01502|201305|0,00 01500|201306|6580,00 01501|201306|6580,00 01502|201306|0,00 01500|201307|3846,00 01501|201307|3846,00 01502|201307|0,00 01500|201308|4100,00 01501|201308|4100,00 01502|201308|0,00 01500|201309|9935,00 01501|201309|9935,00 01502|201309|0,00 01500|201310|1504,00 01501|201310|1504,00 01502|201310|0,00 01500|201311|8625,00 01501|201311|8625,00 01502|201311|0,00 01500|201312|5400,00 01501|201312|5400,00 01502|201312|0,00 01500|201401|745,00 01501|201401|745,00 01502|201401|0,00 01500|201402|1505,00 01501|201402|1505,00 01502|201402|0,00 01500|201403|3317,13 01501|201403|3317,13 01502|201403|0,00 01500|201404|3234,13 01501|201404|3234,13 01502|201404|0,00 01500|201405|4100,00 01501|201405|4100,00 01502|201405|0,00 01500|201406|4709,50 01501|201406|4709,50 01502|201406|0,00 01500|201407|6285,00 01501|201407|6285,00 01502|201407|0,00 01500|201408|2072,50 01501|201408|2072,50 01502|201408|0,00 01500|201409|5728,00 01501|201409|5728,00 01502|201409|0,00 01500|201410|1536,13 01501|201410|1536,13 01502|201410|0,00 01500|201411|3090,00 01501|201411|3090,00 01502|201411|0,00 02000|41722,39|55293,51|38842,39|41722,39|55293,51|||55293,51|55293,51|0,00|0,00 03000|09162602000110|MG|4647|2520,00|1,00|3600000,00|0|| 03100|10|2520,00 03110|||2520,00|0|0|0|0|0|0|0|0|6,000|151,20|0,000|0,00|0,000|0,00|||4,000|100,80|||0,000|0,00|2,000|50,40|0,000|0,00|0,00|5 04000|1001|0,00|||||| 04000|1002|0,00|||||| 04000|1004|0,00|||||| 04000|1005|0,00|||||| 04000|1006|100,80|||||| 04000|1008|0,00|||||| 04000|1010|50,40||||||4647 99999|83 00000|12345678201411001|01071500200507399|09380606030934931861|20150102142755|Versao: 1.5.8.0|12345678000103|MARIO CELSO DE SOUZA - ME|4647|S|20080515|201411|0,00|0,000|1,00|A|0||0,00|0,00 01500|201301|1818,20 01501|201301|1818,20 01502|201301|0,00 01500|201302|3018,30 01501|201302|3018,30 01502|201302|0,00 01500|201303|4727,48 01501|201303|4727,48 01502|201303|0,00 01500|201304|4363,00 01501|201304|4363,00 01502|201304|0,00 01500|201305|3563,80 01501|201305|3563,80 01502|201305|0,00 01500|201306|3636,50 01501|201306|3636,50 01502|201306|0,00 01500|201307|3818,35 01501|201307|3818,35 01502|201307|0,00 01500|201308|4477,89 01501|201308|4477,89 01502|201308|0,00 01500|201309|4363,64 01501|201309|4363,64 01502|201309|0,00 01500|201310|3818,20 01501|201310|3818,20 01502|201310|0,00 01500|201311|2867,10 01501|201311|2867,10 01502|201311|0,00 01500|201312|1818,38 01501|201312|1818,38 01502|201312|0,00 01500|201401|3090,92 01501|201401|3090,92 01502|201401|0,00 01500|201402|2363,65 01501|201402|2363,65 01502|201402|0,00 01500|201403|2036,50 01501|201403|2036,50 01502|201403|0,00 01500|201404|1454,60 01501|201404|1454,60 01502|201404|0,00 01500|201405|1942,15 01501|201405|1942,15 01502|201405|0,00 01500|201406|2254,60 01501|201406|2254,60 01502|201406|0,00 01500|201407|727,30 01501|201407|727,30 01502|201407|0,00 01500|201408|1818,20 01501|201408|1818,20 01502|201408|0,00 01500|201409|545,50 01501|201409|545,50 01502|201409|0,00 01500|201410|1890,95 01501|201410|1890,95 01502|201410|0,00 02000|22809,85|42290,84|18124,37|22809,85|42290,84|||42290,84|42290,84|0,00|0,00 03000|09600931000103|MG|4647|0,00|1,00|3600000,00|0|| 99999|70

5 respostas

Não consigo pensar em uma solução que não envolva uma linguagem de programação. Mas, com um pequeno script em PHP é possível fazer isto. Somente usando o mysql, na minha opinião, não dá.

Como você construiria o escopo deste projeto?

Quando comecei a idealizar este projeto também pensei em fazer uma aplicação em Php com MySql, mas começou a ficar complexo daí comecei a estudar mais a fundo.

Queria tentar separa em dois projetos a linguagem em PHP para ler o arquivo, e outro projeto com query direto no banco de como isso funcionaria sem o PHP, mas até agora sem sucesso.

Para vocês terem uma ideia do que eu estou pensando só na parte de banco achei um código e tentei rodar para popular ao menos uma tabela, mas ainda não consegui rodar:

load data infile 'c:/dasnunico/originais/90-0000-PUB-PGDASD-20150101-01.txt'

into table reg00000

fields terminated by '|' 
lines terminated by '\n' 

(col1,col2,@col3,@col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,col17,col18,col19)

set

col1 = Pgdasd_ID_Declaracao int(17),
col2 = Pgdasd_Num_Recibo int(17),
col3 = Pgdasd_Num_Autenticacao int(20),
col4 = Pgdasd_Dt_Transmissao int(14),
col5 = Pgdasd_Versao char(20),
col6 = Cnpjmatriz int(14),
col7 = Nome char(56),
col8 = Cod_TOM int(4),
col9 = Optante char(1),
col10 = Abertura date,
col11 = PA int(6),
col12 = Rpa double,
col13 = R double,
col14 = IM double,
col15 = Operacao char(1),
col16 = Regime int(1),
col17 = RpaC  double,
col18 = Rpa_Int double,
col19 = Rpa_Ext double,
;

Também tentei da forma abaixo mas apresentou o seguinte erro:

1290 - O servidor MySQL está rodando com a opção --secure-file-priv razão pela qual não pode executar esse commando

LOAD DATA INFILE 'C:/DASNUNICO/ORIGINAIS/90-0000-PUB-PGDASD-20150101-01.txt'

INTO TABLE reg00000 

FIELDS TERMINATED BY '|' 
LINES TERMINATED BY '\n' 

(@col1,@col2,@col3,@col4,@col5,@col6,@col7,@col8,@col9,@col10,@col11,@col12,@col13,@col14,@col15,@col16,@col17,@col18,@col19)

SET 

Pgdasd_ID_Declaracao = @col1,
Pgdasd_Num_Recibo = @col2, 
Pgdasd_Num_Autenticacao = @col3,
Pgdasd_Dt_Transmissao = @col4,
Pgdasd_Versao = @col5,
Cnpjmatriz = @col6, 
Nome = @col7, 
Cod_TOM = @col8, 
Optante = @col9, 
Abertura = @col10,
PA = @col11,
Rpa = @col12,
R = @col13,
IM = @col14,
Operacao = @col15,
Regime = @col16,
RpaC = @col17,
Rpa_Int = @col18,
Rpa_Ext = @col19
;

Aqui tem uma explicação de como resolver esse erro de permissão:

http://stackoverflow.com/questions/32737478/how-should-i-tackle-secure-file-priv-in-mysql

Chadu

A melhor forma de se resolver isso é tratando os dados via alguma linguagem, feito isso você pode salvar a informação "tratada"

abraço