如何将修剪后的数据输入 Rust 中的 csv 阅读器?

问题描述 投票:0回答:1

我对 Rust 很陌生,正在尝试使用 csv 和 serde 板条箱来读取 .csv 文件。

我遇到的问题是 csv 文件前面有一些垃圾,所以我需要先将其删除,然后才能读取我想要的数据。

我没有得到任何编译错误,但我没有从 csv 反序列化块中得到任何打印结果

我知道在我的代码中,数据是没问题的,直到我制作 csv 阅读器。

use std::{error::Error, process};
use std::io::Cursor;

use serde::Deserialize;

#[derive(Debug, Deserialize)]

struct Record {
    beans: String,
    rice: String,
    jesus: String,
    christ: String,
}
fn run() -> Result<(), Box<dyn Error>> {
    let data = "
   foobar
   foo,bar,boo,far
   
   
   
   
   boofar
   beans,rice,jesus,christ
   thing,thing2,thing3,thing4
   thing5,thing6,thing7,thing8
   ";

    // Create an iterator over the lines
    let mut lines_iter = data.lines();

    // Skip the first 8 lines
    for _ in 0..8 {
        if let Some(line) = lines_iter.next() {
            // Skip the line
        } else {
            // File has fewer than 8 lines, handle this error case if needed
            eprintln!("File has fewer than 8 lines");
            process::exit(1);
        }
    }

    let mut remaining_lines = Vec::new();

    // Collect the remaining lines, removing newline characters
    for line in lines_iter {
        let pusher = line.to_string(); // Convert &str to String
        println!("test {:?}", &pusher);
        remaining_lines.push(pusher);
    }

    let csv_data = remaining_lines.join(",");

    // Create CSV reader from the remaining lines
    let mut rdr = csv::ReaderBuilder::new()
        // .trim(Trim::Fields)
        .from_reader(Cursor::new(csv_data));

    // Iterate over CSV records and process them
    for result in rdr.deserialize() {
        let record: Record = result?;
        println!("{:?}", record);
    }

    Ok(())
}

fn main() {
    if let Err(err) = run() {
        println!("{}", err);
        process::exit(1);
    }
}
csv rust serde
1个回答
0
投票

您将所有行连接成一行。这使得它们全部成为一个标题行,解串器会忽略这一行。

示例:

use std::error::Error;
use std::io::Cursor;

use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct Record {
    beans: String,
    rice: String,
    jesus: String,
    christ: String,
}

fn main() -> Result<(), Box<dyn Error>> {
    let data = "
   foobar
   foo,bar,boo,far
   
   
   
   
   boofar
   beans,rice,jesus,christ
   thing,thing2,thing3,thing4
   thing5,thing6,thing7,thing8
   ";

    let (skip, _) = data
        .char_indices()
        .filter(|&(_, ch)| ch == '\n')
        .nth(7)
        .expect("no 8 lines");
    let csv_data = &data[skip..].trim();

    // Create CSV reader from the remaining lines
    let mut rdr = csv::ReaderBuilder::new()
        // .trim(Trim::Fields)
        .from_reader(Cursor::new(csv_data));

    // Iterate over CSV records and process them
    for result in rdr.deserialize() {
        let mut record: Record = result?;
        
        // Remove the leading indentation.
        record.beans.replace_range(0.."   ".len(), "");
        
        println!("{:?}", record);
    }

    Ok(())
}
© www.soinside.com 2019 - 2024. All rights reserved.