Computação e Programação MEMec, LEAN - 1º Semestre 2015-2016 Aula Teórica 14 Ficheiros de dados Processo de leitura/escrita em ficheiros de texto Manipulação de uma base de dados Ficheiros de dados do Matlab (.mat) Folhas de cálculo (.xls) D.E.M. Área Científica de Controlo Automação e Informática Industrial Wrap Up da última aula Estruturas de dados Agregam diversos valores com alguma relação lógica entre si, podendo estes ser do mesmo tipo, ou de tipos diferentes Tipos de dados Iguais Diferentes Estruturas de dados Arrays(vectores ou matrizes) Structures(estruturas) Cell arrays(tabelas de células) 2 1
Wrap Up da última aula Struct (estrutura) agrupa dados logicamente relacionados de qualquer tipo, num conjunto de campos Vantagens Desvantagens os campos possuem identificadores, o que torna mais claro que tipo de informação contêm É fácil agrupar várias estruturas com a mesma forma num vector numa estrutura não se pode aceder à informação através de indíces numéricos, o que faz com que não se possa percorrer toda a informação com ciclos 3 Wrap Up da última aula Struct (estrutura) agrupa dados logicamente relacionados de qualquer tipo, num conjunto de campos Criação Preferencialmente através da função (constructor) struct. Exemplo: aluno = struct('nome','joão','numero',22331) Acesso aos dados Usando o operador. antes do nome do campo. Exemplo: disp(aluno.numero) 4 2
Alinhamento da AT 14 Ficheiros de dados Processo de leitura/escrita em ficheiros de texto Manipulação de uma base de dados Ficheiros de dados do Matlab (.mat) Folhas de cálculo (.xls) 5 Entrada / Saída de dados O disco rígido providencia um suporte não-volátil para armazenamento de dados (ao contrário da memória do computador cuja informação se perde ao terminar o programa) 6 3
Entrada / Saída de dados A gestão do conteúdo, comunicações, e a organização do disco rígido está normalmente a cargo do Sistema Operativo(Windows, MacOS, Unix, etc.) Os programas podem aceder (ler/escrever) à informação no disco rígido sob a forma de ficheiros Os ficheiros são blocos de informação identificados pelo Sistema Operativo com um dado nome, cuja forma exacta depende do Sistema Operativo nome_do_ficheiro.extensão 7 Formatos usuais dos ficheiros de dados ASCII Binário.txt.dat.csv ( ).mat Ficheiros com dados em formato de texto (são editáveis nos editores de texto comuns como o Notepad) Ficheiros em formato específico do MATLAB, guardam os nomes e conteúdo das variáveis Folha de cálculo.xls Folhas de cálculo do Excel 8 4
Alinhamento da AT 14 Ficheiros de dados Processo de leitura/escrita em ficheiros de texto Manipulação de uma base de dados Ficheiros de dados do Matlab (.mat) Folhas de cálculo (.xls) 9 Leitura / escrita formatada de ficheiros Os ficheiros não são apenas uma forma de guardar informação no disco rígido, podem ser também uma forma de comunicação relativamente simples e segura entre programas Um ficheiro de texto com dados, criado num programa especializado, pode ser facilmente consultado ou modificado em qualquer editor de texto comum Uma função pode ser facilmente criada para ler o seu conteudo e aplicá-lo nos cálculos de outro programa 10 5
Processo de leitura/escrita em ficheiros 1) 2) 3) Abertura Manipulação Fecho Cria ligação entre o ficheiro no disco rígido e um identificador no nosso código fonte Usualmente uma operação de Leitura Escrita Total Escrita em Anexo Termina ligação do ficheiro com o programa, libertando-o para ser utilizado por outros programas 11 Processo de leitura/escrita em ficheiros Funções básicas 1) Abertura fopen fgetl 2) Manipulação fgets fscanf textscan fprintf Leitura Escrita 3) Fecho fclose 12 6
Abertura de ficheiros Cria ligação entre o ficheiro no disco rígido e um identificador no código fonte do programa Sintaxe: fid = fopen(nome_ficheiro, permissão) Permissões permissão Descrição r w a abertura para leitura abertura para escrita anexação Identificadores fid Descrição -1 Erro na abertura 0 a 2 identificadores reservados para o MATLAB 3 ou superior identificador do ficheiro 13 Fecho de ficheiros Termina ligação do ficheiro com o programa, libertando-o para ser utilizado por outros programas Sintaxe: resultado = fclose(fid) Identificadores resultado Descrição -1 erro no fecho 0 sucesso 14 7
Processo usual de abertura/fecho Excerto de código fonte num script representando o processo de abertura e fecho de um ficheiro 15 Escrita em ficheiros Descrição: grava num ficheiro o conteúdo formatado de uma cadeia de caracteres (também serve para escrever no ecrã) Sintaxe: fprintf(fid,texto) fprintf(fid,formato,var) Permissão necessária:'w' escrita (cria um novo ficheiro ou re-escreve o ficheiro existente) 'a' anexação (acrescenta a informação ao final do ficheiro) 16 8
Exemplo de escrita em ficheiro de texto Variável contendo o identificador do ficheiro Juntar o sufixo 't' à permissão para ficheiros texto (ver help da função fopen) Ciclo que percorre o vector e escreve os seus elementos linha-a-linha 17 Exemplo de escrita em ficheiro de texto A execução do script anterior cria um novo ficheiro de texto chamado MeusDados.txtcom o conteúdo do vector Editor do MATLAB >> escrevemeusdados >> Notepad 18 9
Exemplo de escrita em ficheiro de texto Permissão para anexação Devido à forma como funciona a função fprintfno MATLAB, o ciclo fornão é realmente necessário nalguns casos 19 Exemplo de escrita em ficheiro de texto A execução do script anterior anexa o novo conjunto de valores ao ficheiro MeusDados.txt Editor do MATLAB >> escrevemeusdados2 >> Notepad 20 10
Exemplo de código fonte completo 21 Leitura de ficheiros linha-a-linha função fgetl fgets feof Descrição Lê uma cadeia de caracteres do ficheiro especificado até encontraro carácter \n, descartando-o Semelhante à instrução fgetlmas mantém o carácter de controlo \nna cadeia de caracteres. Permite especificar um número máximo de caracteres a ler. Devolve um valor lógico verdadeiro se na última operação de leitura for encontrado o fim do ficheiro 22 11
Leitura de ficheiros linha-a-linha Descrição: ambas as funções lêm uma linha do ficheiro Sintaxe: tline = fgetl(fid) tline = fgets(fid,num_caract_maximo) Permissão necessária: 'r' leitura 23 Exemplo de leitura linha-a-linha Enquanto não for encontrado o fim do ficheiro Obter nova linha eof 24 12
Exemplo de leitura linha-a-linha A execução do script anterior apresenta os dados com a nova formatação no ecrã. Note-se que, neste caso, os dados não ficaram guardados em memória, já que todas variáveis são redefinidas a cada passagem pelo ciclo. >> leitura_linha_a_linha 5.3 a 2.2 b 3.3 c 4.4 a 1.2 b >> 25 Exemplo de leitura de ficheiro com cabeçalho Leitura do cabeçalho de dimensão conhecida Leitura dos dados 26 13
Exemplo de leitura de ficheiro com cabeçalho >> leitura_com_cabecalho 5.3 a 2.2 b 3.3 c 4.4 a 1.2 b >> disp(cabecalho) Guarda valores e código Data: 2011-11-01 Autores: José e Mariana >> disp(cabecalho(2,:)) Data: 2011-11-01 27 Leitura de ficheiros completos função fscanf textscan Descrição Lê dados formatados a partir de um ficheiro para variáveis compativeis com o formato especificado. Utiliza os mesmos caracteres de controlo da instrução fprintf. Semelhante à instrução fscanfmas o resultado é armazenado num cell array. 28 14
Exemplo de leitura de ficheiro completo Leitura do conteúdo completo Separação e conversão dos dados 29 Exemplo de leitura de ficheiro completo A execução do script anterior guarda todos os dados na forma numérica sendo necessária a reconversão dos caracteres utilizando a função char. >> leitura_de_uma_vez dados = 5.3450 2.2220 3.3320 4.4160 1.1780 97.0000 98.0000 99.0000 97.0000 98.0000 valores = codigo = abcab 5.3450 2.2220 3.3320 4.4160 1.1780 30 15
Alinhamento da AT 14 Ficheiros de dados Processo de leitura/escrita em ficheiros de texto Manipulação de uma base de dados Ficheiros de dados do Matlab (.mat) Folhas de cálculo (.xls) 31 Exemplo base de dados de alunos Turma: AM21T 30 2 Nome: Joã Silmes 1 Número: Nome: João 22331 Silva Nome: Número: João 22331 Silva Número: Nota: 2233115 Nota: 15 Nota: 15 Usar um vector de estruturas para construir uma base de dados da turma Alunos Turma AM21T Número da ficha Nome Numero de Aluno Nota 1 João Silva 22331 15 2 Paulo Almeida 98734 17 30 Manuel Gomes 12345 12 32 16
Exemplo de introdução manual >> gerir_alunos Introduza o número do aluno, ou 0 para terminar: 12345 Introduza o nome: Antero Palhinhas Introduza a nota: 14 Novo aluno! Introduza o número do aluno, ou 0 para terminar: 98765 Introduza o nome: Julia Mansinho Introduza a nota: 17 Novo aluno! Introduza o número do aluno, ou 0 para terminar: 45678 Introduza o nome: Vitor Faquinha Introduza a nota: 19 Novo aluno! 33 Ler dados para um vector de estruturas A leitura dos dados para a ficha de um aluno pode ser feita de uma só vez, se for conhecido o formato da informação fornecida Esta forma é mais comum na leitura de ficheiros de texto formatados Neste caso é necessário dar quatro passos: 1. Ler todos os dados de um aluno para uma string 2. Partir a stringno número de campos desejado 3. Converter os valores numéricos 4. Atribuir os dados aos campos da estrutura 34 17
Ler dados para um vector de estruturas O vector completo de alunos pode ser lido num ciclo, que se repete até ao fim do ficheiro, em que, a cada nova linha, se acrescenta uma nova estrutura (um novo elemento) ao vector Todos os dados de um aluno são escritos na mesma linha do ficheiro, podendo serseparados por caracteres especiais, ou organizados por colunas No caso de serem separados por caracteres especiais, a função strtokpode ser utilizada para fazer a partição da string 35 Ler dados para um vector de estruturas Caso os dados sejam organizados por colunas, basta utilizar os índices da string lida do ficheiro para separar os dados. 36 18
Ler dados para um vector de estruturas Dados organizados por colunas [número] [nome] [nota] >> turmamemec = leturmaficheiro('turma_memec.dat'); >> apresentaturma(turmamemec); Numero Nome Nota 12345 Antero Palhinhas 14 98765 Julia Mansinho 17 45678 Vitor Faquinha 19 37 Escrever um vector de estruturas A escrita para um ficheiro requer que seja fornecido um identificador à função fprintf 38 19
Escrever um vector de estruturas A mesma função pode ser utilizada para escrever a base de dados para o ecrã ou para um ficheiro, dado que o identificador 1é reservado pelo MATLAB para o ecrã >> escreveturma(turma,1) Numero Nome Nota 12345 Antero Palhinhas 14 98765 Julia Mansinho 17 45678 Vitor Faquinha 19 39 Escrever um vector de estruturas >> id = fopen('basededados.txt','wt'); >> escreveturma(turma,id); >> fclose(id); 40 20
Alinhamento da AT 14 Ficheiros de dados Processo de leitura/escrita em ficheiros de texto Manipulação de uma base de dados Ficheiros de dados do Matlab (.mat) Folhas de cálculo (.xls) 41 Função pré-definida load *revisão Descrição: carrega de um ficheiro para o workspace um conjunto de variáveis sem formatação Sintaxe: load load NomeFicheiro Variáveis load(nomeficheiro, 'Variáveis') >> load meu_ficheiro >> load meu_ficheiro variavel_2 >> load meu_ficheiro var* >> load ('meu_ficheiro', 'variavel_1'); meu_ficheiro.mat 42 21
Função pré-definida save *revisão Descrição: grava num ficheiro um conjunto de variáveis sem formatação Sintaxe: save save NomeFicheiro Variáveis save(nomeficheiro, 'Variáveis') >> save meu_ficheiro >> save meu_ficheiro variavel_1 variavel_2 >> save meu_ficheiro v* >> NomeFicheiro = 'meu_ficheiro'; >> save(nomeficheiro, 'variavel_1') meu_ficheiro.mat 43 Anexação de dados a um ficheiro.mat >> save append meu_ficheiro nova_variavel meu_ficheiro.mat >> whos -file meu_ficheiro Name Size Bytes Class Attributes nova_variavel 1x1 8 double variavel_1 1x1 8 double variavel_2 1x1 8 double 44 22
Alinhamento da AT 14 Ficheiros de dados Processo de leitura/escrita em ficheiros de texto Manipulação de uma base de dados Ficheiros de dados do Matlab (.mat) Folhas de cálculo (.xls) 45 Ligação a folhas de cálculo função xlswrite xlsread Descrição Instrução de escrita numa folha de cálculo com extensão.xls (formato padrãodo Microsoft Excel) Instrução de leitura a partir de uma folha de cálculo com extensão.xls (formato padrãodo Microsoft Excel) 46 23
Exemplo Matlab2Excel Descrição: cria uma folha de Excel, ou escreve dados numa folha já existente, e numa dada gama de índices Sintaxe: xlswrite(nome,m,folha,gama) >> matriz = [12.7 1.98-99 11.3 2.01-87]; >> xlswrite('meu_teste.xls',matriz); >> 47 Exemplo Matlab2Excel >> matriz = [12.7 1.98-99 11.3 2.01-87]; >> xlswrite('meu_teste.xls',matriz,'minha Folha',... 'B3:D4'); Acrescenta a nova folha ao ficheiro e escreve a matriz nos índices indicados 48 24
Exemplo Excel2Matlab Descrição: lê dados a partir de uma folha de Excel, separando a informação numérica da informação de texto Sintaxe: [num,txt] = xlsread(nome,folha,gama) >> val = xlsread('meu_teste.xls') val = 12.7000 1.9800-99.0000 11.3000 2.0100-87.0000 49 Exemplo Excel2Matlab >> [num,text] = xlsread('meu_teste.xls','grupo',... 'A3:C4') num = 423 987 text = 'c' '' 'David' 'd' '' 'Burt' Lê da folha e gama especificadas, e atribui os valores numéricos a um array, e o texto a um cell array 50 25
Boas práticas de Programação Fechar sempre os ficheiros que foram abertos. Verificar sempre se os ficheiros foram correctamente abertos e fechados. Utilizarumarepetiçãoatéatingiro fimdo ficheiro quando se lê um ficheiro linha-a-linha, para garantir quetodaa informaçãoé lida. Tero cuidadode utilizara stringde formatação correcta com as funções fscanf ou textscan. 51 Referências Capítulo 9 de Stormy Attaway (2012), Matlab: A Practical Introduction to Programming and Problem Solving, Elsevier. As aulas teóricas contêm contribuições dos profs. José Borges e Miguel Silva 52 26