我正在学习锈菌,我有一个简单的程序,我希望用它来做一个学习练习。我在这里的目标是更好地了解正确的做事方法。
我试图使用fastq箱对fastq文件进行一些操作--这些是用于存储高通量DNA/RNA测序数据的简单文本文件。我想要做的是修改条目的子集,并将修改后的条目写入文件。
现在,我有了下面概念的初步证明,它可以修改每个质量值的第一个字节。我想确定我做的事情是否明智。我的一般思维过程:
上面的过程和下面的代码看起来合理吗?你会有不同的做法吗?为什么?由于我对锈菌如此陌生,我觉得我可能是以一种天真和不太理想的方式看待事物。告诉我你的大致想法。
依赖关系:
下面是我的示例代码:
use bytes::BytesMut;
use fastq::{Parser, parse_path, Record, RefRecord};
use std::env::args;
const READS: &str = r#"@read1/ENST00000266263.10;mate1:84-183;mate2:264-363
GACAGCCAGGGGCCAGCGGGTGGCAGTGCCCAGGACATAGAGAGAGGCAGCACACACGCGGTTGATGGTGAAGCCCGGAATGGCCACAGAGGCTAGAGCC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read2/ENST00000266263.10;mate1:163-262;mate2:283-382
GATGCCATTGACAAAGGCAAGAAGGCTGGAGAGGTGCCCAGCCCTGAAGCAGGCCGCAGCGCCAGGGTGACTGTGGCTGTGGTGGACACCTTTGTATGGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read3/ENST00000266263.10;mate1:86-185;mate2:265-364
GGACAGCCAGGGGCCAGCGGGTGGCAGTGCCCAGGACATAGAGAGAGGCAGCANACACACGGTTGATGGTGAAGCCCGGAATGGCCACAGAGGCTAGAGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII!IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read4/ENST00000266263.10;mate1:297-396;mate2:401-500
CAGGAGGAGCTGGGCTTCCCCACTGTTAGGTAGAGCTTGCGCAGGCTGGAGTCCAGGAGGAAATCCACCGACCTGTCAATGGGGTGGATAATGATGGGGA
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
"#;
fn main() {
let mut total: usize = 0;
let parser = Parser::new(READS.as_bytes());
parser.each(|record| {
println!("Before mod");
println!("{}", String::from_utf8_lossy(record.qual()));
let mut owned_rec = RefRecord::to_owned_record(&record);
let mut curr_bytes = BytesMut::from(owned_rec.qual());
curr_bytes[0] = b'$';
owned_rec.qual = curr_bytes.to_vec();
println!("After mod");
println!("{}", String::from_utf8_lossy(owned_rec.qual()));
total += 1;
true
}).expect("Invalid fastq file");
println!("{}", total);
}另外,我希望把这个过程变成一个函数,所以我想知道做这个的最佳过程。我正在考虑一个函数modify_qual,它可以为我执行这个任务。对于这种情况,您的函数签名是什么样子的?也许某种东西会消耗记录并返回修改过的记录?还有别的吗?我理解易变性的概念,在表面上通过参考,但没有一个好的心理模型,什么时候去做某些事情。
提前感谢您的帮助!
发布于 2022-05-19 19:39:35
关于你的“你的函数签名看起来像什么”的问题,这些东西在发展过程中会发生变化,所以不需要花太多的时间在它上,
我在下面做了两个方法代码,
use bytes::BytesMut;
use fastq::{Parser, Record, RefRecord};
const READS: &str = r#"@read1/ENST00000266263.10;mate1:84-183;mate2:264-363
GACAGCCAGGGGCCAGCGGGTGGCAGTGCCCAGGACATAGAGAGAGGCAGCACACACGCGGTTGATGGTGAAGCCCGGAATGGCCACAGAGGCTAGAGCC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read2/ENST00000266263.10;mate1:163-262;mate2:283-382
GATGCCATTGACAAAGGCAAGAAGGCTGGAGAGGTGCCCAGCCCTGAAGCAGGCCGCAGCGCCAGGGTGACTGTGGCTGTGGTGGACACCTTTGTATGGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read3/ENST00000266263.10;mate1:86-185;mate2:265-364
GGACAGCCAGGGGCCAGCGGGTGGCAGTGCCCAGGACATAGAGAGAGGCAGCANACACACGGTTGATGGTGAAGCCCGGAATGGCCACAGAGGCTAGAGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII!IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read4/ENST00000266263.10;mate1:297-396;mate2:401-500
CAGGAGGAGCTGGGCTTCCCCACTGTTAGGTAGAGCTTGCGCAGGCTGGAGTCCAGGAGGAAATCCACCGACCTGTCAATGGGGTGGATAATGATGGGGA
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
"#;
fn main() {
let mut total: usize = 0;
let parser = Parser::new(READS.as_bytes());
parser
.each(|record| {
// modify_qual1(record, &mut total)
println!("Before mod");
println!("{}", String::from_utf8_lossy(record.qual()));
let owned_rec = modify_qual(record);
println!("After mod");
println!("{}", String::from_utf8_lossy(owned_rec.qual()));
total += 1;
true
})
.expect("Invalid fastq file");
println!("{}", total);
}
fn modify_qual(record: RefRecord) -> fastq::OwnedRecord {
let mut owned_rec = RefRecord::to_owned_record(&record);
let mut curr_bytes = BytesMut::from(owned_rec.qual());
curr_bytes[0] = b'$';
owned_rec.qual = curr_bytes.to_vec();
owned_rec
}
fn modify_qual1(record: RefRecord, total: &mut usize) -> bool {
println!("Before mod");
println!("{}", String::from_utf8_lossy(record.qual()));
let mut owned_rec = RefRecord::to_owned_record(&record);
let mut curr_bytes = BytesMut::from(owned_rec.qual());
curr_bytes[0] = b'$';
owned_rec.qual = curr_bytes.to_vec();
println!("After mod");
println!("{}", String::from_utf8_lossy(owned_rec.qual()));
*total += 1;
true
}https://stackoverflow.com/questions/72129003
复制相似问题