Home > Net >  Writing csv file with CSV.jl throws StackOverflowError message
Writing csv file with CSV.jl throws StackOverflowError message

Time:10-17

CSV.write() returns: ERROR: LoadError: StackOverflowError: further down claiming --- the last 2 lines are repeated 39990 more times ---. Which is nonsense since the data frame to be written is acknowledged to be of 129x6 dimension with no empty fields. I fear the function is counting rows beyond the dimension of the data frame and shouldn't be doing so. How do I make this function work?

using CSV,DataFrames
file=DataFrame(
        a=1:50,
        b=1:50,
        c=Vector{Any}(missing,50),
        d=Vector{Any}(missing,50))
CSV.write("a.csv",file)
file=CSV.read("a.csv",DataFrame)    # Here the output claims rows are being ommited
c,d=[],[]
for i in 1:nrow(file)
    push!(c,file.a[i]*file.b[i])
    push!(d,file.a[i]*file.b[i]/file.a[i])
end
file[!,:c]=c
file[!,:d]=d
# I found no straight forward way to fill empty columns based on the values of filled columns in a for loop that wouldn't generate error messages
CSV.write("a.csv",DataFrame) # Error in question here

CodePudding user response:

The StackOverflowError is indeed due to the line

CSV.write("a.csv",DataFrame)

which tries to write the data type itself to a file instead of the actual dataframe variable. (The reason that leads to this particular error is an implementation detail that's described here.)

# I found no straight forward way to fill empty columns based on the values of filled columns in a for loop that wouldn't generate error messages

You don't need a for loop for this, just

file.c = file.a .* file.b
file.d = file.a .* file.b ./ file.a

will do the job. (Though I don't understand the point of the file.d calculation - maybe this is just a sample dummy calculation you chose just for illustration.)

  • Related