dyr
2020 年7 月 26 日 14:48
1
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我不太理解
dyr
2020 年7 月 26 日 14:52
2
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
结尾的文件
dyr
2020 年7 月 27 日 04:13
6
我是windows欸……请问是这样吗……因为win不行吗……
对的, 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 来避免大量的内存分配
johnnychen94:
Windows 没有 cat
命令
powershell 搞起
Get-Content *.csv | Add-Content output.csv
1 个赞
dyr
2020 年7 月 30 日 07:54
9
感谢啦!我运行了一下可以拼到下面,请问如果想横向可以嘛
dyr
2020 年7 月 30 日 08:05
10
我试了可以谢谢啦!还想请教一下横向拼接也可以有类似的程序嘛~
ZMAlt
2020 年7 月 31 日 01:05
12
我感觉 shell 对文本文件的处理是最方便的,速度也没得说。不论是上面说到的 cat 。还是你想实现的横向可以用到的 paste 或者 join 。可以试试 win 下的 wsl
老师想问您下,如果要求速度的话,像上面那样拼接dataframe,应该怎么写呢?怎么样才能使写入cs的速度更快呢?