如何在不重写整个文件的情况下删除或编辑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的数据,每次修改值时刷新所有行都不是我想要的。