我正在尝试解析CSV文件,如果某个字段匹配,请使用不同的值更新某个字段,但是我不确定如何执行此操作。
我的代码:
extern crate csv;
use std::error::Error;
fn run(file: &str, output: &str) -> Result<(), Box<Error>> {
let mut rdr = csv::Reader::from_path(file)?;
let mut wtr = csv::Writer::from_path(output)?;
wtr.write_record(rdr.byte_headers()?);
for result in rdr.byte_records() {
let mut record = result?;
if &record[0] == "05V".as_bytes() && &record[4] == "4".as_bytes() {
// let record[4] = "2"; -> Not sure how to update the field
}
wtr.write_byte_record(&record);
}
Ok(())
}
如果记录符合条件,如何更新字段?
答案 0 :(得分:2)
您不要。 ByteRecord
(扩展名为StringRecord
)存储all of the field's data in a single tightly-packed Vec<u8>
。您无法轻易访问此Vec
来对其进行修改,并且当前公开的突变方法太粗糙而无法在这种情况下使用。您可以从记录的末尾删除字段或清除整个内容,但不能替换一个字段。
相反,您可以在需要时创建全新的ByteRecord
并输出:
for result in rdr.byte_records() {
let input_record = result?;
let output_record = if &input_record[0] == b"05V" && &input_record[4] == b"4" {
input_record
.into_iter()
.enumerate()
.map(|(i, v)| if i == 4 { b"2" } else { v })
.collect()
} else {
input_record
};
wtr.write_byte_record(&output_record);
}