如何更新csv :: ByteRecord中的字段?

时间:2018-07-24 14:34:52

标签: csv rust

我正在尝试解析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(())
}

如果记录符合条件,如何更新字段?

1 个答案:

答案 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);
}