在Raku中每n行读取文本文件时需要建议

Tao*_*ang 6 raku

我正在寻找一些有关如何在Raku / perl6中按第n个文件读取文本文件的建议。

在生物信息学研究中,有时我们需要以一种不太直接的方式来解析文本文件。例如Fastq文件,一次以4行为一组存储数据。甚至更多,这些Fastq文件成对出现。因此,如果我们需要解析此类文件,则可能需要执行以下操作:从第一个Fastq文件读取4行,从第二个Fastq文件读取4行,然后从第一个Fastq文件读取接下来的4行,然后读取第二个fastq文件中的下4行,......

关于解决此问题的最佳方法,我是否可以提出一些建议?Raku的“ IO.lines”方法似乎能够一次处理每一行。但不确定如何处理每第n行

一个示例fastq文件对:https : //github.com/wtwt5237/perl6-for-bioinformatics/tree/master/Come%20on%2C%20sister/fastq 我们之前对“ IO.lines”进行的尝试:https:// github.com/wtwt5237/perl6-for-bioinformatics/blob/master/Come%20on%2C%20sister/script/benchmark2.p6

Eli*_*sen 7

读4号线从2个文件时间和它们加工成一个单一的东西,可以轻松完成zipbatch

my @filenames = <file1 file2>;
for zip @filenames.map: *.IO.lines.batch(4) {
    # expect ((a,b,c,d),(e,f,g,h))
}
Run Code Online (Sandbox Code Playgroud)

这将继续产生,直到至少一个文件被完全处理。一个替代方法batchrotor:当两个文件完全填满4行时,它将继续进行。完成循环的其他方法是还使用来指定:partial标志rotor,并使用roundrobin代替zip。YMMV。


Hol*_*lli 5

您可以使用该lines方法。Raku Sequence的很懒。这意味着对类似的表达式进行迭代"somefile".IO.lines只会将一行读入内存,而不会读取整个文件。为了进行后者,您需要将分配SequenceArray

pairs方法可帮助您获取行的索引。结合除以运算符,%%我们可以编写

"somefile".IO.lines.pairs.grep({ .key && .key %% 4 }).map({ .value })
Run Code Online (Sandbox Code Playgroud)

为了获得文件中第4行的顺序。