首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >导出到Julia中的CSV文件

导出到Julia中的CSV文件
EN

Stack Overflow用户
提问于 2020-10-08 17:04:35
回答 1查看 1.5K关注 0票数 2

警告:这些都是菜鸟的问题,因为我对朱莉娅真的很陌生。

在R中,有一个非常“统一”的函数,可以用read.table()导出(几乎)任何类型的对象。看来朱莉娅的情况要复杂一些。如果我理解得很好:

  1. 一些标准类型(例如数组、字典和元组)总是可以用writedlm导出,但并不总是用CSV.write导出。相反,DataFrames总是可以用CSV.write导出,但永远不能用writedlm导出。这是正确的吗?因此,没有类似R's write.table()意义上的“通用出口商”
  2. 在编写CSV文件的同时,CSV.write似乎还返回导出文件的名称。相反,writedlm没有。这对我来说是个问题。实际上,我需要一种将DataFrame导出到不返回值的函数的CSV文件中的方法,即只具有副作用的函数,如writedlm。朱莉娅有办法做到这一点吗? 编辑:要了解更多细节,我的问题是在CSV.write之后,ans指向导出文件的名称;而writedlm的情况并非如此。这里这里的插图。即使@Przemyslaw Szufel给出了这个想法,我也无法摆脱它。(这是一个很微妙的问题,但我实际上是在为Julia写一个emacs后端。这种不一致,例如在导出对象之后不知道ansnothing还是文件名,会给这次冒险增加一些痛苦.-理想情况下,我只是希望CSV.write能保持沉默。)

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 17:22:42

我从第二个问题开始,因为它很短。只需在行尾使用分号;,就不会返回任何值!

代码语言:javascript
运行
复制
CSV.write(file, table);

但是,如果您想确保ans没有任何价值,请在最后添加nothing

代码语言:javascript
运行
复制
CSV.write(file, table);nothing;

如果您需要,可以将其打包到一个函数中:

代码语言:javascript
运行
复制
function my_write(file, table)
    CSV.write(file, table)
    nothing
end

或者,如果你想要一个单衬垫,把它包成一个灯笼:

代码语言:javascript
运行
复制
julia> (() -> begin;CSV.write("file.csv", df);nothing;end)()

julia> ans == nothing
true

在每种情况下,都不会观察到副作用(返回值)。

第一个问题更棘手。用于将数据存储在文件中的可能格式显然需要依赖于数据的格式。对于Julia来说,最常见的选项包括(我从最普通的选项开始,在最具体的选项上结束):

  • 通过serialize命令序列化
  • 通过BSON.jl包的二进制JSON
  • 通过JSON.jl或稍新的JSON3.jl包进行JSON (从今天起都是一个不错的选择)
  • 存储为JSON的表格数据的JSONTables.jl
  • 用于存储DelimitedFilesArray
  • 用于存储CSV.jlDataFrame

现在,特定包的选择将取决于您的目标是什么。串行化是一种致命的机制--速度最快,用途最广。任何对象都可以在尽可能短的时间内以这种方式存储。没有什么是没有成本的-当您更新Julia版本或您的包,您可能无法读取您的对象回来。因此,它是为短期存储而设计的。

其中一半是基于JSON的存储系统。基本上,一切都可以存储为JSON,以后可以用Julia或其他编程语言读取。基于文本的JSON也可以在一个简单的文本编辑器中打开。

最后,CSV.jlSerialization可以分别用于表和数组。但是,将DataFrame转换为Array或将Array转换为DataFrame很容易。

代码语言:javascript
运行
复制
julia> df = DataFrame(a=1:3, b=rand(3),c=["a","b","c"])
3×3 DataFrame
│ Row │ a     │ b        │ c      │
│     │ Int64 │ Float64  │ String │
├─────┼───────┼──────────┼────────┤
│ 1   │ 1     │ 0.440796 │ a      │
│ 2   │ 2     │ 0.44232  │ b      │
│ 3   │ 3     │ 0.282064 │ c      │

julia> Matrix(df)
3×3 Array{Any,2}:
 1  0.440796  "a"
 2  0.44232   "b"
 3  0.282064  "c"

您可以看到,在这个过程中丢失的唯一东西是类型信息,如果您要通过DelimitedFiles导出数据,那么类型信息就无关紧要了。

相反,转换也很简单:

代码语言:javascript
运行
复制
julia> rand(3,3) |> Tables.table |> DataFrame
3×3 DataFrame
│ Row │ Column1  │ Column2   │ Column3  │
│     │ Float64  │ Float64   │ Float64  │
├─────┼──────────┼───────────┼──────────┤
│ 1   │ 0.326649 │ 0.0278134 │ 0.111221 │
│ 2   │ 0.769378 │ 0.996156  │ 0.237821 │
│ 3   │ 0.802094 │ 0.726497  │ 0.619013 │

总之,正如你所看到的,一切都可以用朱莉娅来完成。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64267362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档