It doesn’t necessarily require a parametric type - you can provide runtime dispatch with something like
...
process_var1(var1::Array{Float64, 2}) = ...
process_var1(var1::Float64) = ...
...
function read(files, vars)
dfs = [DataFrame(CSV.File(file)) for file in files]
...
result1 = process_var1(vars[1])
...
end