Comma-separated-values (CSV) 文件是非常有效的表格存储方式。 CSV 文件相比其他数据存储文件有两点优势。首先,正如名称所指示的那样,它使用逗号来分隔存储值。此首字母缩写词也被用作文件扩展名。因此,请确保使用“.csv”扩展名(例如“myfile.csv”)保存文件。为了演示 CSV 文件的结构,安装 包:
并且通过以下方式导入:
using CSV
现在可使用之前的数据:
grades_2020()
并在写入后从文件中读取:
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
上文还能看到 CSV 数据格式的第二个好处:可以使用简单的文本编辑器读取数据。 这与许多需要专有软件的其他数据格式不同,例如 Excel。
这很有效,但是如果我们的数据 包含逗号 ,
作为值怎么办? 如果我们天真地用逗号写入数据,那么文件将很难转换回表格。 幸运的是,CSV.jl
会自动处理此问题。 考虑以下带逗号,
的数据:
function grades_with_commas()
df = grades_2020()
df[3, :name] = "Alice,"
df
end
grades_with_commas()
function write_comma_csv()
path = "grades-commas.csv"
CSV.write(path, grades_with_commas())
end
path = write_comma_csv()
read(path, String)
因此,CSV.jl
在包含逗号的值周围添加引号 "
。 解决此问题的另一种常见方法是将数据写入 tab-separated values (TSV) 文件格式。 该格式假设数据不包含制表符,这一点在大多数情况下是成立的。
另请注意,也可以使用简单的文本编辑器读取 TSV 文件,这些文件使用“.tsv”扩展名。
function write_comma_tsv()
CSV.write(path, grades_with_commas(); delim='\t')
read(write_comma_tsv(), String)
name grade_2020
Sally 1.0
Bob 5.0
Alice, 8.5
Hank 4.0
像 CSV 和 TSV 这样的文本文件格式还可以使用其他分割符,例如分号“;”,空格“ ”,甚至是像“π”这样不寻常的字符。
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
按照惯例,最好还是为文件指定特殊的分隔符,例如“;”,“.csv”扩展名。
使用 CSV.jl
加载 CSV 文件的方式与此类似。 您可以使用 CSV.read
并指定您想要的输出格式。 这里指定为DataFrame
。
path = write_grades_csv()
CSV.read(path, DataFrame)
方便地,CSV.jl
将自动推断列类型:
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
4 │ Hank 4.0
1×5 DataFrame
│ String3 Date Int64 Float64 DateTime
─────┼──────────────────────────────────────────────────────────
1 │ Kim 2018-02-03 3 4.0 2018-02-03T10:00:00
这些CSV基础应该涵盖大多数用例。 关于更多信息,请参阅CSV.jl 文档尤其是。
4.1.2 Excel
多个 Julia 包可以读取 Excel 文件。 本节将只讨论 ,因为它是 Julia 生态系统中处理 Excel 数据的最积极维护的包。 另外一个优点是,XLSX.jl
是用纯 Julia 编写的,这使得可以轻松地检查和理解指令背后发生的事情。
加载 XLSX.jl
的方式是
using XLSX:
eachtablerow,
readxlsx,
writetable
为了写入文件,我们为数据和列名定义一个辅助函数:
function write_xlsx(name, df::DataFrame)
path = "$name.xlsx"
data = collect(eachcol(df))
cols = names(df)
writetable(path, data, cols)
end
现在,可以轻松地将成绩写入 Excel 文件:
function write_grades_xlsx()
path = "grades"
write_xlsx(path, grades_2020())
"$path.xlsx"
end
当成绩被读取回来时,我们将看到 XLSX.jl
将数据放在 XLSXFile
类型中,并且可以像访问 Dict
一样访问所需的 sheet
:
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())
eachtablerow(sheet) |> DataFrame