4.1 Carregar e salvar arquivos

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.

4.1.1 CSV

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()
Table 5: 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.

4.1.2 Excel

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.



CC BY-NC-SA 4.0 Jose Storopoli, Rik Huijzer, Lazaro Alonso