I’m unclear about the restriction about not “making it an iterable”. Why not use eachrow?
julia> using DataFrames, CSV
julia> df = DataFrame(a=[1,2,3,4,5], b=["Tamas_Papp", "NathanEvans", "langestefan", "aplavin", "mkitti"])
5×2 DataFrame
Row │ a b
│ Int64 String
─────┼────────────────────
1 │ 1 Tamas_Papp
2 │ 2 NathanEvans
3 │ 3 langestefan
4 │ 4 aplavin
5 │ 5 mkitti
julia> open("cool.csv", "w") do f
for row in eachrow(df)
CSV.write(f, DataFrame(row), append=true)
end
end
julia> read("cool.csv", String) |> println
1,Tamas_Papp
2,NathanEvans
3,langestefan
4,aplavin
5,mkitti
Here’s a variation that is perhaps closer to your original prompt.
julia> using DataFrames, CSV
julia> nts = @NamedTuple{a::Int64, b::String}[
(1,"Tamas_Papp"),
(2,"NathanEvans"),
(3,"langestefan"),
(4,"aplavin"),
(5,"mkitti")
]
5-element Vector{@NamedTuple{a::Int64, b::String}}:
(a = 1, b = "Tamas_Papp")
(a = 2, b = "NathanEvans")
(a = 3, b = "langestefan")
(a = 4, b = "aplavin")
(a = 5, b = "mkitti")
julia> stateful = Iterators.Stateful(nts)
Base.Iterators.Stateful{Vector{@NamedTuple{a::Int64, b::String}}, Union{Nothing, Tuple{@NamedTuple{a::Int64, b::String}, Int64}}}([(a = 1, b = "Tamas_Papp"), (a = 2, b = "NathanEvans"), (a = 3, b = "langestefan"), (a = 4, b = "aplavin"), (a = 5, b = "mkitti")], ((a = 1, b = "Tamas_Papp"), 2))
julia> f = open("cool.csv", "w")
IOStream(<file cool.csv>)
julia> CSV.write(f, DataFrame([first(iterate(stateful))]), append=true, header=true)
IOStream(<file cool.csv>)
julia> CSV.write(f, DataFrame([first(iterate(stateful))]), append=true)
IOStream(<file cool.csv>)
julia> CSV.write(f, DataFrame([first(iterate(stateful))]), append=true)
IOStream(<file cool.csv>)
julia> CSV.write(f, DataFrame([first(iterate(stateful))]), append=true)
IOStream(<file cool.csv>)
julia> CSV.write(f, DataFrame([first(iterate(stateful))]), append=true)
IOStream(<file cool.csv>)
julia> close(f)
julia> read("cool.csv", String) |> println
a,b
1,Tamas_Papp
2,NathanEvans
3,langestefan
4,aplavin
5,mkitti