curso10.mw

 

Apêndice - Leitura e Gravação de Arquivos de Dados 

 

Gravação de arquivos de dados 

O comando writedata é o comando mais simples para gravar dados no formato de N  colunas. A sintaxe é 

 

writedata( "nome do arquivo",  lista_de_dados) 

 

Note que a lista_de_dados tem que estar no formato de lista de listas: L = [L1, L2, L3, () .. ()], onde cada lista L1, L2, L3, () .. () tem tamanho N. O arquivo será gravado no mesmo diretório onde a folha de trabalho está gravada. Se a folha de trabalho é nova, o "nome do arquivo" deve conter a cadeia de diretórios e subdiretórios. 

 

Exemplo 1: Vamos supor que M é uma matrix `*`(3, 3) com números ponto-flutuantes. 

> restart

> M := matrix([[4.78753417717148810, .487702024997047623, .634934081467530276], [2.73440759602491923, 3.16179623112704755, 4.52895968537809601], [1.39249109433524199, 4.56687928069509663, 4.073618431965...
M := matrix([[4.78753417717148810, .487702024997047623, .634934081467530276], [2.73440759602491923, 3.16179623112704755, 4.52895968537809601], [1.39249109433524199, 4.56687928069509663, 4.073618431965...
array( 1 .. 3, 1 .. 3, [( 1, 2 ) = (.487702024997047623), ( 1, 3 ) = (.634934081467530276), ( 3, 3 ) = (4.07361843196589479), ( 2, 1 ) = (2.73440759602491923), ( 2, 2 ) = (3.16179623112704755), ( 1, 1... (1.1)
 

Vamos agora gravar as entradas da matriz M em um arquivo chamado "arquivo1.dat" no formato de 3 colunas. As duas primeiras colunas guardam os índices da matriz e a terceira coluna a entrada correspondente. As primeiras linhas do arquivo devem ser 

 

1  1  4.78753417717148810 

1  2  .487702024997047623 

1  3  .634934081467530276 

 

Primeiro temos que converter a matrix em uma lista de listas com o comando: 

> L := [seq(seq([i, j, M[i, j]], i = 1 .. 3), j = 1 .. 3)]
[[1, 1, 4.78753417717148810], [2, 1, 2.73440759602491923], [3, 1, 1.39249109433524199], [1, 2, .487702024997047623], [2, 2, 3.16179623112704755], [3, 2, 4.56687928069509663], [1, 3, .63493408146753027...
[[1, 1, 4.78753417717148810], [2, 1, 2.73440759602491923], [3, 1, 1.39249109433524199], [1, 2, .487702024997047623], [2, 2, 3.16179623112704755], [3, 2, 4.56687928069509663], [1, 3, .63493408146753027...
[[1, 1, 4.78753417717148810], [2, 1, 2.73440759602491923], [3, 1, 1.39249109433524199], [1, 2, .487702024997047623], [2, 2, 3.16179623112704755], [3, 2, 4.56687928069509663], [1, 3, .63493408146753027...
(1.2)
 

Agora podemos usar o comando writedata : 

O arquivo1.dat está no mesmo diretório onde a worksheet curso10.mw foi salva. O resultado será 

 

1  1   4.787534177 

2  1   2.734407596 

3   1   1.392491094 

1  2   0.487702025 

2  2   3.161796231 

3  2  4.566879281 

1  3  0.6349340815 

2  3  4.528959685 

3   3   4.073618432 

 

Podemos também gravar diretamente M, porém os índices não serão gravados 

> writedata(

O resultado gravado no arquivo2.dat será 

 

 

 

O número de dígitos depende do valor da variável global Digits . No caso acima, o valor é default igual a 10. 

 

 

O comando mais completo para gravação de arquivos no formato de colunas é fprintf , cuja sintax é  

fprintf( "nome do arquivo",  "formato de gravação",  x1, x2, x3, ... ) 

O nome de arquivo deve vir entre aspas duplas, por exemplo, "arquivo1.dat", e neste caso deve estar no mesmo diretório da worksheet. Se o arquivo estiver em outro diretório, é necessário dar o caminho completo, por exemplo, "/home/users/arquivo1.dat". Não é permitido usar a barra invertida simples "\" (mesmo no Windows). O arquivo deve ser aberto como o comando fclose e fechado com fopen , conforme mostra o exemplo abaixo. O "formato de gravação" é da forma "%d%d%f" para gravar no formato integer, integer, floating point, respectivamente, se o arquivo tive 3 colunas. Os valores x1, x2, x3  serão repassados para a gravação usando o formato correspondente, no caso integer, integer, floating point.  

 

Exemplo 2: Vamos supor que M é a mesma matrix `*`(3, 3) com números ponto-flutuantes descrita acima. 

> writedata(

> fd := fopen(

>

>

> fprintf(fd,

>

>

> fclose(fd)
(1.3)
 

O "\n" no final do formato de gravação força a mudança de linha cada vez que o comando fprintf for acionado. O formato "%1.8f" quer dizer ponto flutuante com uma casa antes do ponto e 8 casas após o ponto. O resultado gravado no arquivo1.dat será 

 

1 1 4.78753418 

1 2 0.48770202 

1 3 0.63493408 

2 1 2.73440760 

2 2 3.16179623 

2 3 4.52895969 

3 1 1.39249109 

3 2 4.56687928 

3 3 4.07361843 

 

Leitura de arquivos de dados no formato de colunas 

O comando readdata é o comando mais simples para ler dados no formato de N  colunas. A sintaxe é 

 

readdata( "nome do arquivo",  N) 

 

ou 

 

readdata( 

 

para ler um arquivo de 3 colunas a primeira e segunda do tipo integer e a terceira do tipo float. O comando readdata retorna uma lista de listas: L = [L1, L2, L3, () .. ()], onde cada lista L1, L2, L3, () .. () tem tamanho N  e contém os dados de cada linha. O "nome do arquivo" deve conter também a cadeia de diretórios e subdiretórios onde ele está gravado. Para evitar o doloroso processo de descobrir e escrever corretamente a cadeia de diretórios, o usuário deve gravar a folha de trabalho (worksheet) no mesmo diretório onde a planilha está. Depois deve fechar a folha de trabalho e abrir novamente dando clique-duplo no nome da folha de trabalho. Depois deste processo, o diretório default de leitura e gravação é o diretório da folha de trabalho. 

 

Exemplo 1: Suponha que o arquivo de dados, cujo nome é arquivo1.dat, seja composto de três colunas. As duas primeiras colunas são os índices de uma matriz `*`(3, 3) (tipo integer) e a terceira coluna guarda as respectivas entradas (tipo float): 

 

1  1  4.78753418 

1  2  0.48770202 

1  3  0.63493408 

2  1  2.73440760 

2  2  3.16179623 

2  3  4.52895969 

3  1  1.39249109 

3  2  4.56687928 

3  3  4.07361843 

 

>

> restart

> L := readdata(
[[1, 1, 4.78753418], [1, 2, .48770202], [1, 3, .63493408], [2, 1, 2.73440760], [2, 2, 3.16179623], [2, 3, 4.52895969], [3, 1, 1.39249109], [3, 2, 4.56687928], [3, 3, 4.07361843]]
[[1, 1, 4.78753418], [1, 2, .48770202], [1, 3, .63493408], [2, 1, 2.73440760], [2, 2, 3.16179623], [2, 3, 4.52895969], [3, 1, 1.39249109], [3, 2, 4.56687928], [3, 3, 4.07361843]]
(2.1)
 

Pronto, os dados já foram lidos. Agora vamos convertê-los no formato de uma matriz. 

> M := Matrix(3, 3); -1

>

> M[i[1], i[2]] := i[3]

>

> M
rtable(1 .. 3, 1 .. 3, [[4.78753418, .48770202, .63493408], [2.73440760, 3.16179623, 4.52895969], [1.39249109, 4.56687928, 4.07361843]], subtype = Matrix) (2.2)
 

 

O comando mais completo para leitura de arquivos no formato de colunas é fscanf , cuja sintax é  

fscanf(  "Nome de Arquivo entre aspas",  "formato de leitura") 

O nome de arquivo deve vir entre aspas duplas, por exemplo, "arquivo1.dat", e neste caso deve estar no mesmo diretório da worksheet. Se o arquivo estiver em outro diretório, é necessário dar o caminho completo, por exemplo, "/home/users/arquivo1.dat". Não é permitido usar a barra invertida simples "\". 

 

O "formato de leitura" é da forma "%s%d%f" para ler no formato string, integer digit, floating point, respectivamente, se o arquivo tive 3 colunas. 

 

O comando fscanf lê uma linha do arquivo por vez e gera uma lista com o conteúdo da linha. Esta lista deve ser gravada em uma variável de nome L, por exemplo. O número de elementos de L é o número de colunas do arquivo. Cada vez que fscanf é chamado a próxima linha é lida. Ao ler a última linha do arquivo, o comando fscanf retorna [ ] ou 0. 

 

Exemplo 2: Suponha que o arquivo de dados, cujo nome é arquivo1.dat, seja composto de três colunas (igual ao do Exemplo 1). As duas primeiras colunas são os índices de uma matriz `*`(3, 3) e a terceira coluna guarda as respectivas entradas: 

 

1  1  4.78753418 

1  2  0.48770202 

1  3  0.63493408 

2  1  2.73440760 

2  2  3.16179623 

2  3  4.52895969 

3  1  1.39249109 

3  2  4.56687928 

3  3  4.07361843 

 

Os comandos para ler o arquivo arquivo1.dat e criar a matriz M[`*`(3, 3)] usando o comando fscanf  é 

>

> restart

> M := Matrix(3, 3)
M := rtable(1 .. 3, 1 .. 3, [[0, 0, 0], [0, 0, 0], [0, 0, 0]], subtype = Matrix) (2.3)
 

>

> L := fscanf(

> if `or`(L = [], L = 0) then break end if; 1

> M[L[1], L[2]] := L[3]

>

> M
rtable(1 .. 3, 1 .. 3, [[4.78753418, .48770202, .63493408], [2.73440760, 3.16179623, 4.52895969], [1.39249109, 4.56687928, 4.07361843]], subtype = Matrix) (2.4)
 

 

Leitura de arquivos de dados sem formato de colunas 

Para arquivos cujos dados não estão dispostos em colunas, é melhor usar o comando readline . A vantagem desta segunda forma é que podemos ler todo arquivo evitando erros na interpretação dos dados e truncagem na leitura. Porém, todos os dados vão estar no formato string. A sintax do comando readline é 

readline( "Nome do Arquivo" ) 

>

> restart

> linha := 'linha'; -1

>

> linha[contador] := readline(

> if `or`(linha[contador] = [], linha[contador] = 0) then break end if; 1

>

> contador
10 (3.1)
 

Note que todo o arquivo foi lido e cada linha foi gravada. Por exemplo, a primeira linha é 

> linha[1]
1 1 4.78753418 (3.2)
 

Note que a linha foi lida no formato string. Agora podemos usar diversos comandos do Maple para converter estas linha em dados manipuláveis. Por exemplo, podemos usar o comando sscanf , cuja sintax é parecida com o comando fscanf , porém o primeiro argumento deve ser um string. Por exemplo  

> sscanf(linha[1],
[1, 1, 4.78753418] (3.3)
 

Podemos agora gerar a matrix M da seguinte forma 

> M := Matrix(3, 3); -1

>

> L := sscanf(linha[i],

> M[L[1], L[2]] := L[3]

>

> M
rtable(1 .. 3, 1 .. 3, [[4.78753418, .48770202, .63493408], [2.73440760, 3.16179623, 4.52895969], [1.39249109, 4.56687928, 4.07361843]], subtype = Matrix) (3.4)
 

Se o comando sscanf não resolve a conversão, podemos usar comandos de manipulação de strings do pacote StringTools . Suponha que temos uma data no formato "dd/mm/aaaa" e queremos ter acesso aos números que compõem esta data: 

> L1 :=
03/10/2016 (3.5)
 

> with(StringTools); -1

> L2 := [SubString(L1, 1 .. 2), SubString(L1, 4 .. 5), SubString(L1, 7 .. 10)]
[ (3.6)
 

> L3 := map(parse, L2)
[3, 10, 2016] (3.7)
 

Leitura e gravação de planilhas Excel 

Para ler a gravar planilhas devemos carregar o pacote ExcelTools . 

>

> restart

> with(ExcelTools)
(4.1)
 

Atenção: Como foi escrito acima, para evitar o doloroso processo de descobrir e escrever corretamente a cadeia de diretórios, o usuário deve gravar a folha de trabalho (worksheet) no mesmo diretório onde a planilha está. Depois deve fechar a folha de trabalho e abrir novamente dando clique-duplo no nome da folha de trabalho. Depois deste processo, o diretório default de leitura e gravação é o diretório da folha de trabalho. 

 

Vamos começar com um exempo de gravaçao de uma folha da planilha. Suponha que temos a seguinte matrix 

> R1 := Matrix([[
R1 := rtable(1 .. 4, 1 .. 6, [[ (4.2)
 

Note que as entradas são números e strings . Se houver variáveis (sem aspas duplas) elas serão convertidas em strings . Para exportar esta matrix no formato de uma planilha Excel de nome example.xls, usamos o comando Export . 

O terceiro argumento é o nome da folha da planilha. O arquivo "example.xls" será salvo no mesmo diretório desta folha de trabalho (worksheet).  

 

Suponha que temos uma segunda matrix. 

> Export(R1,

> R2 := Matrix([[
R2 := Matrix([[
R2 := rtable(1 .. 4, 1 .. 6, [[ (4.3)
 

Podemos salvar na mesma planilha em uma segunda folha. 

 

Vamos agora fazer o processo inverso, isto é, vamos trazer os dados da planinha para dentro da worksheet. A planilhas devem estar no mesmo diretório da worksheet, caso contrário será necessário dar o caminho completo do arquivo. Vamos recomeçar limpando a memória e recarregando o pacote. 

> Export(R2,

> restart

> with(ExcelTools)
(4.4)
 

Para certificar que a planilhas estão no diretório correto podemos dar o comado 

> system(
0 (4.5)
 

O comando system serve para dar acesso ao sistema operacional subjacente. A sintax é system(" nome_do_comando ") onde nome_do_comando é um comando do sistema operacional da máquina do usuário. O resultado do comando system é irrelevante, porém no caso acima o comando gera um nova janela com a lista de arquivos do diretório default (o diretório que contém a worksheet). 

 

Para importar uma folha da planilha usamos o comando Import . 

> R1 := Import(
R1 := rtable(1 .. 4, 1 .. 6, [[ (4.6)
 

Podemos também ler uma parta da folha, por exemplo, da a partir da primeira coluna e segunda linha (a2) até a terceira coluna e terceira linha (c3). 

> R1 := Import(
R1 := rtable(1 .. 2, 1 .. 3, [[ (4.7)
 

Podemos ser a segunda folha. 

> R2 := Import(
R2 := rtable(1 .. 4, 1 .. 6, [[ (4.8)
 

 

Datas podem ser convertidas em número de dias (a partir do começo do século XX), por exemplo, dia 7 de janeiro de 2013 é convertido em 

>

> `+`(Finance[DayCount]([1, 1, 1901], [7, 1, 2013]), 367)
`+`(Finance[DayCount]([1, 1, 1901], [7, 1, 2013]), 367)
41281 (4.9)
 

Para converter de volta, podemos usar o seguinte procedimento: 

>

> y := `+`(floor(`+`(`*`(date, `*`(`/`(365.26))), `-`(100))), 2000); 1

>

>

>

> return [i, j, y]; 1

>

>

> FAIL

Por exemplo 

>

> Date(41281)
[7, 1, 2013] (4.10)