shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script-pt] Fazendo um "de / para" com um cabeçalho CSV


From: George Robinson
Subject: Re: [shell-script-pt] Fazendo um "de / para" com um cabeçalho CSV
Date: Thu, 29 Jul 2021 13:47:57 -0300

Boa tarde amigos!

Analisei o material enviado pelos sempre excelentes Alfredo e Julio Neves, e confesso que fico cada vez mais impressionado com o poder do bash para esse tipo de tarefa.

Sim, eu sempre tenho algo novo a aprender, me esforço, mas acredito que isso é algo que é necessário sempre buscar mais e mais... Eu consegui, depois de ler e reler N vezes o seguinte resultado:

#!/bin/bash
# Declara Fields
declare -A Fields
Fields=(
    [fname]='First name'.string\(\)
    [mname]='Middle name'.string\(\)
    [lname]='Last name'.string\(\)
    [address]='Address'.string\(\)
    [address2]='Address2'.string\(\)
    [CITY]='City'.string\(\)
    [ST]='state'.string\(\)
    [ZIP]='zip'.string\(\)
    [SEQ_NUM]='seq_num'.int64\(\)
    [CREDIT_DAT]='credit_dat'.string\(\)
    [MAIL_DATE]='mail_date'.string\(\)
    [MAIL_CLASS]='mail_class'.string\(\)
    [EXP_DATE]='exp_date'.string\(\)
    [INHOME_DATE]='inhome_date'.string\(\)
    [lasercode]='lasercode'.string\(\)
    [BATCH_ID]='batch_id'.int32\(\)
    [REFCODE]='refcode'.string\(\)
    [PURL]='purl'.string\(\)
    [PHONE]='phone'.string\(\)
    [PKG_NAME]='pkg_name'.string\(\)
    [consumerid]='consumerid'.int64\(\)
    [age]='age'.int32\(\)
    [fico]='fico'.int32\(\)
    [open_rev_cnt]='open_rev_cnt'.string\(\)
    [utilization]='utilization'.int32\(\)
    [debt]='debt'.int32\(\)
);
for field in "${!Fields[@]}"
    do
        Value=("${Fields[@]}" "${field[@]}")
    done
echo ${Value[@]}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Que produz a seguinte saída:

fico.int32() open_rev_cnt.string() lasercode.string() First name.string() refcode.string() utilization.int32() inhome_date.string() purl.string() zip.string() mail_date.string() credit_dat.string() phone.string() Address.string() City.string() mail_class.string() Last name.string() batch_id.int32() debt.int32() consumerid.int64() age.int32() seq_num.int64() exp_date.string() Address2.string() state.string() pkg_name.string() Middle name.string() mname

Que aredito eu que é baseado no índice mname.

Até aqui, vi que é possível gerar o valor do vetor de acordo com o índice, se eu nao estou enganado, esse resultado é um elemento único. Como eu cheguei a essa conclusão? S eu colocar o echo dentro do FOR, ele vai produzir a mesma saída para cada um dos 25 elementos do array FIELDS.

Entendo que para efeitos de comparação com o arquivo myfile.csv que possui o seguinte cabeçalho:

( fname,mname,lname,address,address2,CITY,ST,ZIP,SEQ_NUM,CREDIT_DAT,MAIL_DATE,MAIL_CLASS,EXP_DATE,INHOME_DATE,lasercode,BATCH_ID,REFCODE,PURL,PHONE,PKG_NAME,consumerid,age,fico,open_rev_cnt,utilization,debt)

eu acredito que estaria tentando comparar toda a saída do echo com cada um dos elementos do arquivo.csv.

Estaria eu enganado?

Atenciosamente,


Em qui., 29 de jul. de 2021 às 09:05, Julio C. Neves <julio.neves@gmail.com> escreveu:
Bom dia George,
não sei se entendi direito o seu problema, mas o Bash possui recursos de vetores associativos (arrays com índice alfanumérico) e tão logo esse recurso foi incorporado ao Bash, escrevi um artigo básico sobre esta técnica que está em http://www.dicas-l.com.br/cantinhodoshell/cantinhodoshell_20100120.php#.YQKYNHVKjb0

Abraços,
Julio
» Não tem tempo para fazer um curso presencial?
» Na sua cidade não tem nenhum bom curso de Linux?

Também damos treinamento em sua empresa
em qualquer cidadecom certificado e nota fiscal.








Em qua., 28 de jul. de 2021 às 20:24, George Robinson <george.robinson.br@gmail.com> escreveu:
Prezados, boa noite!

Montei um pequeno script em shell que faz a leitura de um cabeçalho CSV e os insere em um banco de dados com a seguinte estrutura:

Cabeçalho CSV:

fname,mname,lname,address,address2,CITY,ST,ZIP,SEQ_NUM
William,Dias,Maranhão,Rua Khalifa,Casa  03,Paraty,RJ,24444-444,1

neste caso, o que eu faço no meu script é pegar cada campo e assumir que a sequencia do arquivo sempre será essa. Então quando eu faço um import no banco seria algo assim:

mongoimport -h localhost:27017 -u $mobilendPrdUser -p $mobilendPasswd\
                  --db $mobilendPrdDb \
                  --collection $collection \
                  --type csv \
                  --columnsHaveTypes \
                  --fields 'First name'.string\(\),'Middle name'.string\(\),'Last name'.string\(\),'Address'.string\(\),'Address2'.string\(\),'City'.string\(\),'state'.string\(\),'zip'.string\(\),'seq_num'.int64\(\)

Porém, notei, que em alguns casos, o cabeçalho que recebo para dar carga no banco pode mudar, podendo ter mais campos à esquerda ou a direita. Sendo assim, o cabeçalho
fname,mname,lname,address,address2,CITY,ST,ZIP,SEQ_NUM pode passar a ser
email,id,fname,mname,lname,address,address2,CITY,ST,ZIP,SEQ_NUM,phone,etc ou até mesmo mudança na nomenclatura do cabeçalho (fname, passando a ser first name)

eu gostaria de ter algo como um array contendo todas as possibilidades como por exemplo (fiz em python)

dataTypes = {}
dataTypes["fname"]          = "string"
dataTypes
["firstname"] = "string"
dataTypes["first name"] = "string"
dataTypes["mname"]          = "string"
dataTypes
["middlename"] = "string"
dataTypes["middle name"] = "string"
dataTypes["lname"]          = "string"
dataTypes
["lastname"] = "string"
dataTypes
["last name"] = "string"
dataTypes["address"]        = "string"
dataTypes["address2"]       = "string"
dataTypes["city"]           = "string"
dataTypes["st"]             = "string"
dataTypes["state"]          = "string"
dataTypes["zip"]            = "string"
dataTypes["seq_number"]     = "int64"
dataTypes
["phone"] = "string"
dataTypes["phonenumber"] = "string"
dataTypes["phone number"] = "string"


A ideia seria ter um "índice" de possíveis campos de cabeçalho e "mapeá-los" de acordo com o que recebo no arquivo, já definindo o dataType dele.

Hoje meu script segue uma sequência presumida, que se quebrada, insere os campos fora de posição na tabela, o que me força a atualzar o script para bater com a sequencia recebida.

Se alguém puder me ajudar, acho que só falta essa parte pra ele ficar bem automatizado.

--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.


--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138

reply via email to

[Prev in Thread] Current Thread [Next in Thread]