• Nenhum resultado encontrado

l  O ficheiro texto, com nome praias.txt, com a informação sobre as praias tem várias linhas, cada uma referente a uma obra, com os campos, separados por “;” <concelho> <obra> <custo> <prioridade> Marinha Grande;Esporao da Praia da Vieira;720000.00;Media Lourinha;Arribas junto ao forte do Paimogo;591000.00;Media Lourinha;Arribas em Porto das Barcas;691000.00;Media Lourinha;Arribas em Porto Dinheiro;606500.00;Media Sintra;Arribas da praia Grande do Rodizio;39951.63;Media Sintra;Arribas da praia das Azenhas do Mar;326560.08;Media Sintra;Arribas da praia Pequena;428015.58;Media San(ago do Cacem;Arriba da Praia Fonte do Cor(co;23000.00;Media Sines;Relocalizacao de acessos das praias de Morgavel, Franquia e Farol;100100.00;Media Setubal;Arribas da praia de Galapos;100000.00;Baixa Vila do Bispo;Alimentacao ar(ficial da praia da Mareta;2500000.00;Elevada Por(mao;Saneamento da arriba na praia do Vau;30000.00;Elevada

Exemplo: MATLAB + SQLite

Exemplo: MATLAB + SQLite

l  Mais especificamente, pretende-se a)  Criar uma base de dados (BD) com uma tabela b)  Inserir dados dos projectos de recuperação c)  Ques(onar a BD usando SQL l  Exemplo: §  obter os projectos de prioridade alta, média e baixa.

l  A criação da tabela, que chamaremos Projetos, é feita através de um só comando SQL, chamado do OCTAVE pela função sqlite definida atrás.

l  De notar a especificação da PRIMARY KEY, que garante uma

iden(ficação única de cada registo e a não existência de repe(ções.

§  Neste caso, as obras têm um nome único.

function criaTabela(nomeBD)

% Cria a tabela Projectos na base de dados indicada.

sqlite([’CREATE TABLE Projectos ( Concelho text,',...

'Nome text, Custo float, Prioridade text,',...

'PRIMARY KEY(nome));'], nomeBD);

end

l  Porquê PRIMARY KEY?

§  Numa base de dados relacional, as chaves permitem

relacionar tabelas diferentes.

§  E mesmo só com uma tabela devemos poder iden(ficar

inequivocamente cada registo •  por exemplo, para evitar a inserção de duplicados •  Neste caso assumimos que dois projectos com o mesmo nome seria um erro l  O SQLite cria sempre um atributo chamado Rowid que iden(fica inequivocamente cada registo, mesmo que não se crie uma chave primária.

§  No entanto, esse não serve para evitar registos repe(dos porque incrementa automa(camente.

l  Testes

§  Podemos começar por criar a tabela de Projectos numa BD,

que chamaremos de praias.db, para podermos testar a função

que carrega os dados.

>> criatabela(’praias.db');

% verificar que tabelas existem na BD ‘praias.db

>> sqlite('.tables',’praias.db')

ans = Projectos >>

l  Os dados podem ser carregados na tabela através de uma função com assinatura

function carrega_praias(nomeFich, nomeBD)

que a)  Abre o ficheiro de dados em modo de leitura b)  Para cada linha 1.  Lê os vários campos tendo em conta o seu separador •  Convertendo o custo num valor numérico 2.  Cria uma string correspondente ao comando SQL INSERT , com os dados de cada linha lidos 3.  Executa o comando com a chamada à função sqlite c)  Fecha o ficheiro de dados

Exemplo: MATLAB + SQLite

function carrega_praias(nomeFich, nomeBD)

% documentação em anexo

fid = fopen(nomeFich,'r'); while ~feof(id)

linha = fgetl(fid);

pVirgs = findstr(';', linha); concelho = linha(1:pVirgs(1)-1);

nome = linha(pVirgs(1)+1:pVirgs(2)-1);

custo = str2num(linha(pVirgs(2)+1:pVirgs(3)-1)); prioridade = linha(pVirgs(3)+1:end);

sql = sprintf('insert into Projectos ... values("%s", "%s",%f,"%s");’,... concelho, nome, custo, prioridade) sqlite(sql, nomeBD);

end

fclose(fid);

end

l  Testes

§  podemos agora inserir os dados do ficheiro praias.txt, e

verificar se eles estão corretamente inserido

>> carrega_praias(’praias.txt’, ‘praias.db');

% verificar que registos existem na tabela

>> sqlite(’SELECT * FROM Projectos;','praias.db’)

ans = Marinha Grande|Esporao da Praia da Vieira|720000.0|Media Lourinha|Arribas junto ao forte do Paimogo|591000.0|Media

Lourinha|Arribas em Porto das Barcas|691000.0|Media Lourinha|Arribas em Porto Dinheiro|606500.0|Media

Sintra|Arribas da praia Grande do Rodizio|39951.63|Media Sintra|Arribas da praia das Azenhas do Mar|326560.08|Media Sintra|Arribas da praia Pequena|428015.58|Media

...

Portimao|Saneamento da arriba na praia do Vau|30000.00|Elevada >>

l  Em SQL podem ser feitas consultas (queries) às bases de dados em que as condições WHERE não exigem igualdades estritas mas apenas “semelhanças”, em que alguns caracteres nos campos a pesquisar podem não ser iguais.

l  Para esse efeito

§  Usa-se a palavra LIKE, em vez do simbolo de igualdade

§  U(lizam-se wildcards, %, para susbs(tuirem quaisquer

caracteres.

l  Como anteriormente, estas consultas podem ser feitas

directamente do OCTAVE

l  Exemplo 1 (com LIKE e wildcards)

>> sqlite('SELECT Nome FROM Projectos

WHERE Nome LIKE "Arriba%";',’praias.db’)

% quais os registos cujo Nome comeca por Arriba ans = Arribas junto ao forte do Paimogo

Arribas em Porto das Barcas Arribas em Porto Dinheiro

Arribas da praia Grande do Rodizio Arribas da praia das Azenhas do Mar Arribas da praia Pequena

Arriba da Praia Fonte do Cortico Arribas da praia de Galapos

>>

l  Exemplo 2 (com LIKE e wildcards)

>> sqlite('SELECT Nome FROM Projectos

WHERE Nome LIKE "%praia%";',’praias.db')

% quais os registos cujo Nome contem a palavra praia

ans = Esporao da Praia da Vieira

Arribas da praia Grande do Rodizio Arribas da praia das Azenhas do Mar Arribas da praia Pequena

Arriba da Praia Fonte do Cortico

Relocalizacao de acessos das praias de Morgavel,...Farol Arribas da praia de Galapos

Alimentacao artificial da praia da Mareta Saneamento da arriba na praia do Vau

>>

l  As consultas em SQL podem originar muitas repe(ções nas respostas, nomeadamente se §  vários registos sa(sfaçam as condições; e §  apenas se pretendam alguns do campos dos registos iniciais l  Para evitar estas repe(ções pode u(lizar-se a variante da instrução SELECT, contendo a variante DISTINCT l  Como anteriormente, estas consultas podem ser feitas directamente do OCTAVE

Exemplo: MATLAB + SQLite

l  Exemplo 3 (com DISTINCT)

>> sqlite(‘SELECT DISTINCT Concelho FROM Projectos;’,

’praias.db')

% quais os concelhos mencionados nos registos sem repeticoes ! ans = Marinha Grande

Lourinha Sintra Santiago do Cacem Sines Setubal Vila do Bispo Portimao

>> sqlite(‘SELECT DISTINCT Prioridade FROM Projectos;’,

’praias.db') ans = Media Baixa Elevada >>

Exemplo: MATLAB + SQLite

l  As consultas SQL, feitas através da função sqlite, retornam uma string, eventualmente com várias linhas, em que os campos dos registos retornados são delimitados pelo separador corrente (por omissão, o separador é “|”).

>> sqlite(’SELECT * FROM Projectos;','praias.db’)

ans = Marinha Grande|Esporao da Praia da Vieira|720000.0|Media Lourinha|Arribas junto ao forte do Paimogo|591000.0|Media

Lourinha|Arribas em Porto das Barcas|691000.0|Media Lourinha|Arribas em Porto Dinheiro|606500.0|Media

Sintra|Arribas da praia Grande do Rodizio|39951.63|Media Sintra|Arribas da praia das Azenhas do Mar|326560.08|Media Sintra|Arribas da praia Pequena|428015.58|Media

...

Portimao|Saneamento da arriba na praia do Vau|30000.00|Elevada >>

l  Em geral, será conveniente estruturar melhor estas respostas, transformando as strings retornadas num vetor de estruturas, correspondendo aos registos retornados.

l  Para esse efeito pode usar-se a função com assinatura abaixo que é especificada de seguida

function recs = parseRecords (sqlResult,nameString)

Nota: esta função tem elementos que não fazem parte da matéria de ICE.

function recs = parseRecords(sqlResult,nameString)

% recs=parserecords(sqlResult,nameString)

% Devolve um vector de estruturas organizando os dados na string % devolvida pelo SQLite. Assume que os campos estao separados % por uma barra |. O segundo argumento, opcional, contem uma % string com os nomes dos campos das estruturas devolvidas, % tambem separados por |.

recs = [];

if nargin < 2

names = {};

else

names = strsplit(nameString,'|');

end

ca = strsplit(sqlResult,"\n");

for f = 1:length(ca)-1

... % converte a string sqlResult num vetor de estruturas

end end

for f = 1:length(ca)-1

line = deblank(ca{f});

if length(line) == 0 break end

rec = strsplit(ca{f},'|');

for g = 1:length(rec)

if g > length(names) campo = ['campo_',num2str(g)]; else campo = names{g};

end

% converte em numero, se possivel

testNum = str2double(rec{g}); if isnan(testNum)

valor = rec{g}; else

valor = testNum; end

recs(f).(campo) = valor;

end end

l  Query: §  Obter nome e custo de projetos com uma dada prioridade.

Nota: A função sprinX funciona como fprinX mas em vez de escrever num ficheiro ou consola devolve a string formatada.

function projs = sel_prioridade(tabela, baseDados, prioridade)

% projs=selprioridade(tabela, baseDados, prioridade)

% selecciona da tabela da base de dados indicada os campos do % nome e custo dos projectos com a prioridade especificada.

query = sprintf('SELECT Nome, Custo FROM %s WHERE ...

Prioridade="%s";', tabela, prioridade);

result = sqlite(query, baseDados);

% obter vetor de estruturas com campos nome e custo

projs = parseRecords(result, 'nome|custo');

end

l  Testar

>> elevada = sel_prioridade('Projectos', ’praias.db', 'Elevada');

>> elevada(1)

nome = Alimentacao artificial da praia da Mareta custo = 2500000

>> elevada(2)

nome = Saneamento da arriba na praia do Vau custo = 30000

>> baixa = sel_prioridade('Projectos', ’praias.db', 'Baixa')

baixa =

nome = Arribas da praia de Galapos custo = 100000

>>

l  Query: §  Obter as obras separadas por prioridades «  Basta juntar as queries/funções anteriores

function [elevada,media,baixa] = processa_projs(fich, baseDados)

% [alta,media,baixa]=processaprojs(fich, baseDados) % Cria a tabela Projectos na base de dados indicada, % carrega os dados do ficheiro e selecciona da tabela % os campos do nome do projecto e custo, separando em % tres vectores de estruturas conforme a prioridade.

criatabela(baseDados);

carrega_praias('praias.txt', baseDados);

elevada = selprioridade('Projectos', baseDados, 'Elevada')

media = selprioridade('Projectos', baseDados, 'Media')

baixa = selprioridade('Projectos', baseDados, 'Baixa')

end

>> [elev, medi,baix] = processaprojs('praias.txt',’outra.db')

elev =

1x2 struct array containing the fields: nome custo

medi =

1x9 struct array containing the fields: nome custo

baix =

scalar structure containing the fields:

nome = Arribas da praia de Galapos % mostra o valor dos custo = 100000 % campos por so ter um elemento >> ...

l  Testar

>> elev.nome

ans = Alimentacao artificial da praia da Mareta ans = Saneamento da arriba na praia do Vau

>> med.nome

ans = Esporao da Praia da Vieira

ans = Arribas junto ao forte do Paimogo ans = Arribas em Porto das Barcas

ans = Arribas em Porto Dinheiro

ans = Arribas da praia Grande do Rodizio ans = Arribas da praia das Azenhas do Mar ans = Arribas da praia Pequena

ans = Arriba da Praia Fonte do Cortico

ans = Relocalizacao de acessos das praias de Morgavel, Franquia e Farol

>>

Exemplo: MATLAB + SQLite

Documentos relacionados