Ter os dados apenas dentro dos programas Julia e não ser capaz de carregá-los ou salvá-los seria muito limitante. Portanto, começamos mencionando como armazenar e carregar arquivos do HD. Focamos em formatos de arquivo CSV, veja Section 4.1.1, e Excel, veja Section 4.1.2, uma vez que esses são os formatos de armazenamento de dados mais comuns para dados tabulares.
Arquivos Comma-separated values (CSV, valores separados por vírgula) são eficazes no armazenamento de tabelas. Os arquivos CSV têm duas vantagens sobre outros arquivos de armazenamento de dados. Primeiro, eles fazem exatamente o que o nome indica que fazem, ou seja, armazenam valores, separando-os por vírgulas ,
(ou, em sistemas operacionais ambientados no Brasil, separados por ponto-e-vírgula, pois a vírgula é utilizada como separador decimal). Este acrônimo também é usado como extensão de arquivo. Portanto, certifique-se de salvar seus arquivos usando a extensão “.csv” tal como “myfile.csv.” Para demonstrar a aparência de um arquivo CSV, podemos instalar o pacote CSV.jl
:
julia> ]
pkg> add CSV
e carregá-lo via:
using CSV
Agora podemos usar nossos dados anteriores:
grades_2020()
name | grade_2020 |
---|---|
Sally | 1.0 |
Bob | 5.0 |
Alice | 8.5 |
Hank | 4.0 |
e escrevê-los em um arquivo, para em seguida lê-los novamente:
function write_grades_csv()
path = "grades.csv"
CSV.write(path, grades_2020())
end
path = write_grades_csv()
read(path, String)
name,grade_2020
Sally,1.0
Bob,5.0
Alice,8.5
Hank,4.0
Aqui, também vemos o segundo benefício do formato de dados CSV: os dados podem ser lidos usando um editor de texto simples. Isso difere de muitos formatos de dados alternativos que requerem software proprietário, por exemplo, Excel.
Isso funciona muito bem, mas e se nossos dados contiverem vírgulas ,
como valores? Se tivéssemos de escrever ingenuamente os dados com vírgulas, isso tornaria os arquivos muito difíceis de se converter de volta para uma tabela. Por sorte, CSV.jl
resolve esse problema para nós de forma automática. Considere os seguintes dados com vírgulas ,
:
function grades_with_commas()
df = grades_2020()
df[3, :name] = "Alice,"
df
end
grades_with_commas()
name | grade_2020 |
---|---|
Sally | 1.0 |
Bob | 5.0 |
Alice, | 8.5 |
Hank | 4.0 |
Se escrevermos isso, teremos:
function write_comma_csv()
path = "grades-commas.csv"
CSV.write(path, grades_with_commas())
end
path = write_comma_csv()
read(path, String)
name,grade_2020
Sally,1.0
Bob,5.0
"Alice,",8.5
Hank,4.0
Logo, CSV.jl
adiciona aspas "
em torno dos valores contendo vírgulas. Outra maneira comum de resolver esse problema é gravar os dados em um formato de arquivo tab-separated values (TSV, valores separados por tabulações). Isso pressupõe que os dados não contêm tabulações, o que é válido na maioria dos casos.
Além disso, observe que os arquivos TSV também podem ser lidos usando um editor de texto simples e esses arquivos usam a extensão “.tsv.”
function write_comma_tsv()
path = "grades-comma.tsv"
CSV.write(path, grades_with_commas(); delim='\t')
end
read(write_comma_tsv(), String)
name grade_2020
Sally 1.0
Bob 5.0
Alice, 8.5
Hank 4.0
Também é possível encontrar formatos de arquivo de texto, como arquivos CSV e TSV, que usam outros delimitadores, como ponto-e-vírgula “;” espaços “ ,” ou mesmo algo tão incomum como “π.”
function write_space_separated()
path = "grades-space-separated.csv"
CSV.write(path, grades_2020(); delim=' ')
end
read(write_space_separated(), String)
name grade_2020
Sally 1.0
Bob 5.0
Alice 8.5
Hank 4.0
Por convenção, ainda assim é melhor dar a extensão “.csv” a arquivos com delimitadores especiais, como “;”
O carregamento de arquivos CSV usando CSV.jl
é feito de maneira semelhante. Você pode usar CSV.read
e especificar qual o formato do retorno da função. Nós especificamos um DataFrame
.
path = write_grades_csv()
CSV.read(path, DataFrame)
name | grade_2020 |
---|---|
Sally | 1.0 |
Bob | 5.0 |
Alice | 8.5 |
Hank | 4.0 |
Convenientemente, CSV.jl
irá inferir automaticamente os tipos de dados das colunas para nós:
path = write_grades_csv()
df = CSV.read(path, DataFrame)
4×2 DataFrame
Row │ name grade_2020
│ String7 Float64
─────┼─────────────────────
1 │ Sally 1.0
2 │ Bob 5.0
3 │ Alice 8.5
4 │ Hank 4.0
Funciona mesmo com dados muito mais complexos:
my_data = """
a,b,c,d,e
Kim,2018-02-03,3,4.0,2018-02-03T10:00
"""
path = "my_data.csv"
write(path, my_data)
df = CSV.read(path, DataFrame)
1×5 DataFrame
Row │ a b c d e
│ String3 Date Int64 Float64 DateTime
─────┼──────────────────────────────────────────────────────────
1 │ Kim 2018-02-03 3 4.0 2018-02-03T10:00:00
Essas noções básicas de CSV devem abranger a maioria dos casos de uso. Para obter mais informações, consulte a documentação do CSV.jl
e, especialemnte, o docstring do construtor CSV.File
.
Existem vários pacotes Julia para ler arquivos Excel. Neste livro, nós vamos cobrir apenas o XLSX.jl
, porque é o pacote mais ativamente mantido no ecossistema Julia que lida com dados do Excel. Como um segundo benefício, XLSX.jl
é escrito em Julia puro, o que torna mais fácil para nós inspecionarmos e entendermos o que está acontecendo nos bastidores.
Carregue XLSX.jl
via
using XLSX:
eachtablerow,
readxlsx,
writetable
Para escrever arquivos, definimos uma pequena função auxiliar para dados e nomes de colunas:
function write_xlsx(name, df::DataFrame)
path = "$name.xlsx"
data = collect(eachcol(df))
cols = names(df)
writetable(path, data, cols)
end
Agora, podemos escrever facilmente os dados das notas escolares em um arquivo Excel:
function write_grades_xlsx()
path = "grades"
write_xlsx(path, grades_2020())
"$path.xlsx"
end
Ao ler de volta, veremos que XLSX.jl
coloca os dados em um tipo XLSXFile
e podemos acessar a aba
desejada como um Dict
:
path = write_grades_xlsx()
xf = readxlsx(path)
XLSXFile("grades.xlsx") containing 1 Worksheet
sheetname size range
-------------------------------------------------
Sheet1 5x2 A1:B5
xf = readxlsx(write_grades_xlsx())
sheet = xf["Sheet1"]
eachtablerow(sheet) |> DataFrame
name | grade_2020 |
---|---|
Sally | 1.0 |
Bob | 5.0 |
Alice | 8.5 |
Hank | 4.0 |
Observe que cobrimos apenas o básico de XLSX.jl
mas usos mais poderosos e customizações estão disponíveis. Para obter mais informações e opções, consulte a documentação do módulo XLSX.jl
.