朱莉娅:IO/文件数据的流式转换
这似乎是一个简单的问题,但我不知道如何在朱莉娅身上做到这一点。我们接收文本文件,但它们的换行符为“\01”或“\00”。文件部分较大(~10 GB),这就是为什么我们要打开文件内容流,将“\01”映射到“\r”,然后继续读取行。类似于(伪代码): 最好使用来自文件、CMD和IOBuffer的输入 我知道我们可以调用一个外部命令来进行转换,但我们使用的是Windows和Linux,我们希望有一种方法可以轻松地在两者上工作 鉴于这是一个具体的用例,我们想知道IO流处理在Julia中通常是如何工作的。是否已有易于使用的产品朱莉娅:IO/文件数据的流式转换,io,julia,Io,Julia,这似乎是一个简单的问题,但我不知道如何在朱莉娅身上做到这一点。我们接收文本文件,但它们的换行符为“\01”或“\00”。文件部分较大(~10 GB),这就是为什么我们要打开文件内容流,将“\01”映射到“\r”,然后继续读取行。类似于(伪代码): 最好使用来自文件、CMD和IOBuffer的输入 我知道我们可以调用一个外部命令来进行转换,但我们使用的是Windows和Linux,我们希望有一种方法可以轻松地在两者上工作 鉴于这是一个具体的用例,我们想知道IO流处理在Julia中通常是如何工作的。
非常感谢您的帮助如果
'\01'
是唯一的分隔符,您可以使用:
如果有多个分隔符,则可以使用以下内容的修改版本:
如果您需要更高级的解析,我建议您使用类似于的东西,这不是真正的流,是吗?在我上面的伪代码中,您可以看到“replace”的输出可以完全像文件(IOBuffer)一样处理。在您的示例中,您返回的是数据块,处理文件内容的所有标准方法都不再可用。
open("myfile.dat", read=true) do fd
fd = replace(fd, '\01' => '\r')
for line in eachline(fd)
...
end
end
open("foo.txt"; read=true) do fd
while !eof(fd)
x = readuntil(fd, '\01')
@show x
end
end
function multireaduntil(s::IO, delims::Vector{<:AbstractChar}; keep::Bool=false)
out = IOBuffer()
for c in readeach(s, Char)
if c in delims
keep && write(out, c)
break
end
write(out, c)
end
return String(take!(out))
end
open("foo.txt"; read=true) do fd
while !eof(fd)
x = multireaduntil(fd, ['\00', '\01'])
@show x
end
end