我对 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);
}
}
您将所有行连接成一行。这使得它们全部成为一个标题行,解串器会忽略这一行。
示例:
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(())
}