朱莉娅:IO/文件数据的流式转换

朱莉娅:IO/文件数据的流式转换,io,julia,Io,Julia,这似乎是一个简单的问题,但我不知道如何在朱莉娅身上做到这一点。我们接收文本文件,但它们的换行符为“\01”或“\00”。文件部分较大(~10 GB),这就是为什么我们要打开文件内容流,将“\01”映射到“\r”,然后继续读取行。类似于(伪代码): 最好使用来自文件、CMD和IOBuffer的输入 我知道我们可以调用一个外部命令来进行转换,但我们使用的是Windows和Linux,我们希望有一种方法可以轻松地在两者上工作 鉴于这是一个具体的用例,我们想知道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