如何将多个csv文件写入一个文件中合并

cf_1 = CSV.File("current_in_A.csv";delim=',',comment="#", header=false)
cf_2 = CSV.File("current_in_B.csv";delim=',',comment="#", header=false)
cf_3 = CSV.File("current_in_C.csv";delim=',',comment="#", header=false)

Tables.table(cf_1)

open("a.csv", "w") do io
    CSV.write( io, [cf_1 cf_2 cf_3 ])
end

请问怎么把这三个文件写到一个文件里呢?这个table我不太理解

cf_1 = DataFrame!(CSV.File("current_in_A.csv";delim=',',comment="#", header=false))
cf_2 = DataFrame!(CSV.File("current_in_B.csv";delim=',',comment="#", header=false))
cf_3 = DataFrame!(CSV.File("current_in_C.csv";delim=',',comment="#", header=false))

open("a.csv", "w") do io
    CSV.write( io, [cf_1; cf_2; cf_3])
end

我知道啦用dataframe就可以惹

这种用命令行可能更高效…

cat *.csv > all.csv

把所有 *.csv 文件的内容添加到 all.csv 里。 如果是追加的话就是 >> all.csv.

1 个赞

伤心,我运行有问题,为什么呢……

呃呃呃,我是说在linux shell里跑… 借助linux 的cat命令,因为你这里好像就是按行拼接就好了

如果写julia里的话就是

run(pipeline(`cat *.csv`, stdout="out/all.csv"))

这里 *.csv 会自动匹配到所有 .csv 结尾的文件

我是windows欸……请问是这样吗……因为win不行吗…… :frowning_face:

对的, Windows 没有 cat 命令

对于小文件并且速度不敏感的要求来说,最简单的方式是这样的

function append_to_file(to::AbstractString, from::AbstractString)
    @assert isfile(from)
    open(from, "r") do from
        open(to, "a") do to
            write(to, read(from))
        end
    end
end
datafiles = ["current_a.csv", "current_b.csv", ...]
out = "out.csv"

rm(out, force=true) # 把out的内容删了重新写过
foreach(datafiles) do f
    append_to_file(out, f)
end

如果对速度敏感的话,则需要在write和read之间插入 IOBuffer 来避免大量的内存分配

powershell 搞起

Get-Content *.csv | Add-Content output.csv

1 个赞

感谢啦!我运行了一下可以拼到下面,请问如果想横向可以嘛

我试了可以谢谢啦!还想请教一下横向拼接也可以有类似的程序嘛~

横向就 julia 依次读入,然后合并吧。

2 个赞

我感觉 shell 对文本文件的处理是最方便的,速度也没得说。不论是上面说到的 cat 。还是你想实现的横向可以用到的 paste 或者 join 。可以试试 win 下的 wsl

好滴谢谢~~~~~

好嘞我查找一下相关资料谢谢啦

老师想问您下,如果要求速度的话,像上面那样拼接dataframe,应该怎么写呢?怎么样才能使写入cs的速度更快呢?