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

编辑CSV文件中的特定行,而不重写整个文件,csv,rust,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<

如何在不重写整个文件的情况下删除或编辑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(())
}
extern板条箱csv;//1.0.1
使用csv::{ReaderBuilder,WriterBuilder};
使用std::error::error;
pub fn delete_数据(表名称:String,列:String,查询:String)->Result{
让mut rdr=ReaderBuilder::new()
.has_头(true)
.from_path(format!(“{}.csv”,table_name))?;
让列索引:usize;
{
let header=rdr.byte_headers()?;
column_index=header.iter().position(| r | r==column.as_bytes()).unwrap();
}
让mut wtr=WriterBuilder::new()。从_路径(format!(“{}.csv”,table_name))?;
wtr.write_记录(rdr.byte_headers())?;
对于rdr.byte_记录()中的结果{
让记录=结果?;
if record.get(column_index).unwrap()==query.as_bytes(){
写入记录(和记录)?;
}
}
wtr.flush()?;
好(())
}
我想改进这个解决方案,这样它就不会将整个文件重写为新文件,只编辑需要删除/更新的特定行


例如,我有2GB的数据,每次编辑值时刷新所有行不是我想做的。

csv不是随机访问格式,所以您不能。唯一可以做的就是编辑现有行,使其保留完全相同的字节数。听起来这是XY问题的一个例子。如果您需要对2GB数据集进行有效编辑,则除非您的编辑受到明显限制,否则csv不是正确的格式。我相信您的问题已由的答案回答。如果你不同意,请用你的问题来解释不同之处。否则,我们可以将此问题标记为已回答。或者;;–不管是哪种语言,一般来说,设计是不可能的。好吧,这可以标记为已回答。