computaÇÃo e programaÇÃo - técnico lisboa - … · depois de executar as instruções...

10
João Reis, v1@2010 1 COMPUTAÇÃO E PROGRAMAÇÃO 1º Semestre 2010/2011 MEMec, LEAN Ficha da Aula Prática 8: Processamento de ficheiros. Sumário das tarefas e objectivos da aula: 1. Conhecer as operações necessárias à leitura, escrita e anexação a ficheiros. 2. Conhecer e utilizar as várias funções pré-definidas que permitem a leitura e escrita de ficheiros de texto. 3. Conhecer e utilizar as funções para leitura e escrita de folhas de cálculo.

Upload: hoanghanh

Post on 25-Jan-2019

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 1

COMPUTAÇÃO E PROGRAMAÇÃO 1º Semestre 2010/2011 MEMec, LEAN

Ficha da Aula Prática 8: Processamento de ficheiros.

Sumário das tarefas e objectivos da aula:

1. Conhecer as operações necessárias à leitura, escrita e anexação a ficheiros. 2. Conhecer e utilizar as várias funções pré-definidas que permitem a leitura e escrita de ficheiros de

texto. 3. Conhecer e utilizar as funções para leitura e escrita de folhas de cálculo.

Page 2: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 2

1 Operações elementares de processamento de ficheiros Formatos comuns de ficheiros de dados:

1.1 Procedimento e funções básicas

Abertura

Fecho

Manipulação

− Leitura − Escrita (Substituição, Anexação)

− Estabelece a ligação entre o ficheiro (Sistema Operativo) existente no

disco e o MATLAB

− Encerra a ligação entre o ficheiro (Sistema Operativo) e o MATLAB

ASCII: .txt .dat

Binário: .mat

Folha de cálculo: .xls

(ficheiros de dados/texto típicos, podem ser abertos com o Notepad)

(ficheiros em formato proprietário que SÓ podem ser abertos com o Matlab. Guardam os nomes e conteúdo das variáveis)

(podem ser abertos com o Microsoft Excel)

Page 3: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 3

1.1 Abertura e fecho de um ficheiro

A abertura e fecho de ficheiros são operações realizadas com as funções fopen e fclose.

fopen por omissão abre os ficheiros para leitura. Se for desejada uma outra acção é preciso fornecer uma string de permissão. A função devolve o valor -1 se não foi bem sucedida ou um inteiro >2 caso contrário. Esse inteiro será usado como indentificador do ficheiro pelo Matlab. (NOTA: ver help do fopen para outras permissões)

A função fclose retorna 0 se o ficheiro foi correctamente fechado ou 1 caso contrário. A expressão fclose('all') fecha todos os ficheiros que estiverem abertos . Qualquer das operações deve sempre ser verificada, e o utilizador notificado de algum eventual erro.

1.2 Escrita num ficheiro de texto formatado

1.2 Exemplos de escrita em ficheiros

Eis um exemplo de escrita num ficheiro chamado tryit.txt.

>> fid = fopen('tryit.txt', 'wt');

>> for i = 1:3

fprintf(fid, 'The loop variable is %d\n', i); end

>> fclose(fid);

(NOTA: repare que a permissão utilizada foi 'wt' e não apenas 'w', isto permite a alguns sistemas operativos reconhecer o ficheiro como ficheiro de texto de forma a serem correctamente apresentados em qualquer editor)

Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto do Matlab. O conteúdo deverá ser o seguinte:

Page 4: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 4

Em seguida feche a janela e dirija-se à directoria de trabalho fora do Matlab. Abra o ficheiro com um editor de texto comum como por exemplo o Notepad. O conteúdo deverá ser o seguinte:

Neste exemplo é em primeiro lugar gerada uma matriz de números aleatórios de 2x4, que depois é

escrita num ficheiro utilizando a string de formato '%d %d\n'. Note que ao executar a instrução fprintf o Matlab vai percorrer a matriz mat por colunas, o que significa que estas aparecerão escritas como linhas no ficheiro. Verifique o conteúdo do ficheiro randmat.dat recorrendo ao Notepad.

>> mat = randi([5 20], 2,4)

>> fid = fopen('randmat.dat', 'wt');

>> fprintf(fid, '%d %d\n', mat);

>> fclose(fid);

Feche o ficheiro e repita o exercício anterior. Verifique que os números escritos no ficheiro foram alterados (não se esqueça que a matriz é gerada aleatoriamente), isto é, que o ficheiro foi completamente reescrito.

Se quisermos acrescentar informação a um ficheiro de texto já existente devemos modificar a

permissão de 'wt' para 'at'. Faça essa modificação, execute a sequência de instruções mais duas vezes, e verifique que o ficheiro tem agora um total de doze linhas correspondendo às duas matrizes adicionais.

1.3 HANDS-ON

13. Create a data file that has points in a three-dimensional space stored in the following format: x 2.2 y 5.3 z 1.8

Do this by creating x, y, and z vectors and then use fprintf to create the file in the specified format.

Page 5: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 5

1.3 Leitura de ficheiros de texto

Muitas linguagens de programação não fornecem um método de leitura completa de um ficheiro para uma estrutura de dados, a forma mais comum de ler um ficheiro de texto com dados formatados é a leitura linha-a-linha. Um algoritmo muito genérico para realizar esta tarefa seria:

Tentar abrir o ficheiro; verificar que a operação foi bem sucedida

Se foi aberto repetir os passos seguintes até ser atingido o fim-do-ficheiro

o Ler uma linha para uma string

o Manipular os dados

Tentar fechar o ficheiro; verificar se a operação foi bem sucedida

1.4 Leitura de ficheiros linha-a-linha

Crie num editor de texto à sua escolha um ficheiro com o nome 'subjexp.dat' com o seguinte conteúdo:

5.3 am

2.2 bm

3.3 ad

4.4 am

1.1 bd

A função fgetl pode ser utilizada para ler cada linha do ficheiro para uma string, e depois utilizam-se funções de manipulação de strings para separar os números e os caracteres. O código seguinte lê cada linha, escreve o número com duas casas decimais e depois o resto da string.

% Reads from a file one line at a time using fgetl

% Each line has a number and a character

% The script separates and prints them

% Open the file and check for success

fid = fopen('subjexp.dat');

if fid == –1

disp('File open not successful')

else

while feof(fid) == 0

aline = fgetl(fid);

% Separate each line into the number and character

% code and convert to a number before printing

[num charcode] = strtok(aline);

fprintf('%.2f %s\n', str2num(num), charcode)

end

% Check the file close for success

closeresult = fclose(fid);

if closeresult == 0

disp('File close successful')

else

disp('File close not successful')

end

end

Page 6: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 6

Outra opção para ler de um ficheiro é usar a função textscan. A função textscan lê dados de texto de um ficheiro e guarda-os num cell array, um especificador de formato semelhante ao da função fprintf é utilizado para separar os dados de tipos distintos em células distintas.

1.5 Leitura de ficheiros de uma só vez

Para ler o ficheiro 'subjexp.dat' criado no exemplo anterior poderia fazer-se o seguinte

>> fid = fopen('subjexp.dat');

>> subjdata = textscan(fid,'%f %s');

>> fclose(fid)

A string de formato '%f %c' especifica que em cada linha há um valor do tipo double seguido de um espaço, seguido de uma string. Isto cria um cell array 1x2 chamado subjdata. O primeiro elemento deste cell array é um vector coluna de doubles (a primeira coluna do ficheiro); o segundo elemento é um vector coluna de strings (a segunda coluna do ficheiro), como se mostra a seguir:

>> subjdata

subjdata =

[5x1 double] {5x1 cell}

>> subjdata{1}

ans =

5.3000

2.2000

3.3000

4.4000

1.1000

>> subjdata{2}

ans =

'am'

'bm'

'ad'

'am'

'bd'

Page 7: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 7

1.6 HANDS-ON

fid = fopen('filename');

if fid == –1

disp('File open not successful')

else

while feof(fid) == 0

% Read one line into a string variable

aline = fgetl(fid);

% Use string functions to extract numbers, strings,

% etc. from the line

% Do something with the data!

end

closeresult = fclose(fid);

if closeresult == 0

disp('File close successful')

else

disp('File close not successful')

end

end

Utilizando uma versão modificada por si do código anterior crie uma função que receba uma string contendo um nome de ficheiro, e que devolva o conteúdo do ficheiro num array de strings. Teste a sua função lendo o conteúdo do ficheiro testit.txt criado no exemplo 1.2 e verifique o conteúdo do array na janela de comando do Matlab.

1.7 Leitura de ficheiros de uma só vez

6. Crie um ficheiro 'phonenos.dat', de números de telefone com a seguinte forma:

6012425932

6178987654

8034562468

Crie um script que leia os números de telefone do ficheiro e escreva-os na janela de comando na seguinte forma:

601–242–5932

Use a função load para ler o ficheiro.

load phonenos.dat for i = 1:length(phonenos) phonstr = num2str(phonenos(i)); phonstr = [phonstr(1:3) '-' phonstr(4:6) '-' phonstr(7:end)]; fprintf('%s\n',phonstr); end

Page 8: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 8

7. Para o mesmo ficheiro 'phonenos.dat' do problema anterior use textscan para ler os números de telefone, e depois escreva-os na janela de comando no formato indicado.

fid = fopen('phonenos.dat'); if fid == -1 disp('File open not successful') else phonenos2 = textscan (fid, '%3s%3s%4s');

len = length(phonenos2{1}); for i= 1:len fprintf('%s-%s-%s\n',phonenos2{1}{i},phonenos2{2}{i},phonenos2{3}{i}); end

closeresult = fclose(fid); if closeresult == 0 disp('File close successful') else disp('File close not successful') end end

1.8 HANDS-ON

14. Create a file that has some college department names and enrollments. For example, it might look like this:

Aerospace 201

Civil 45

Mechanical 66

Write a script that will read the information from this file and create a new file that has just the first four characters from the department names, followed by the enrollments. The new file will be in this form:

Aero 201

Civi 45

Mech 66

(NOTA: TENHA EM ATENÇÃO OS TESTES NECSSÁRIOS À ABERTURA E FECHO DOS FICHEIROS)

Page 9: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 9

2 Folhas de cálculo

2.1 Exemplos de escrita e leitura de folhas de cálculo usando o Matlab

19. Uma folha de cálculo 'popdata.xls', guarda o registo de habitantes de uma pequena cidade a cada 20 anos. Crie no Excel uma folha de cálculo com os dados que se indicam a seguir (incluindo o cabeçalho) e leia os cabeçalhos para um cell array e os números para uma matriz. Apresente os dados num gráfico com os cabeçalhos como rótulos.

>> [nums, txt] = xlsread('popdata.xlsx')

>> bar(nums(:,1), nums(:,2));

>> xlabel(txt{1})

>> ylabel(txt{2})

18. Um fabricante guarda informação sobre os pesos de algumas peças num cell array. Cada linha guarda o código da peça seguido pelos pesos de algumas amostras. De forma a simular esta informação crie o seguinte cell array:

>> parts = {'A22', 4.41 4.44 4.39 4.39

'Z29', 8.88 8.95 8.84 8.92}

E em seguida escreva esta informação para uma folha de cálculo usando a função xlswrite.

>> xlswrite('myspreadsheet',parts)

Abra no programa Excel a folha de cálculo 'myspreadsheet'. O conteúdo deverá ser o que se mostra na figura seguinte:

Page 10: COMPUTAÇÃO E PROGRAMAÇÃO - Técnico Lisboa - … · Depois de executar as instruções seguintes procure o ficheiro na janela da directoria de trabalho e abra-o no editor de texto

João Reis, v1@2010 10

3 Bibliografia Capítulo 8 de Stormy Attaway (2009), “Matlab: A Practical Introduction to Programming and Problem

Solving”, Elsevier.