编辑CSV文件中的特定行,而无需重写整个文件

时间:2018-08-24 15:04:18

标签: csv rust

如何在不重写整个文件的情况下删除或编辑CSV文件中的特定行?

此代码可与 rust-csv 库一起使用,并且效果很好:

extern crate csv; // 1.0.1

use csv::{ReaderBuilder, WriterBuilder};
use std::error::Error;

pub fn delete_data(table_name: String, column: String, query: String) -> Result<(), Box<Error>> {
    let mut rdr = ReaderBuilder::new()
        .has_headers(true)
        .from_path(format!("{}.csv", table_name))?;
    let column_index: usize;
    {
        let header = rdr.byte_headers()?;
        column_index = header.iter().position(|r| r == column.as_bytes()).unwrap();
    }

    let mut wtr = WriterBuilder::new().from_path(format!("{}.csv", table_name))?;
    wtr.write_record(rdr.byte_headers()?)?;

    for result in rdr.byte_records() {
        let record = result?;
        if record.get(column_index).unwrap() == query.as_bytes() {
            wtr.write_record(&record)?;
        }
    }

    wtr.flush()?;
    Ok(())
}

我想改进该解决方案,以便它不会将整个文件重写为新文件,而仅编辑删除/更新所需的特定行。

例如,我有2GB的数据,每次修改值时刷新所有行都不是我想要的。

0 个答案:

没有答案