cts_csv/csv/
read.rs

1use std::io::{Error, ErrorKind};
2
3use serde::de::DeserializeOwned;
4
5/// 读取csv数据,解析成结构体
6/// @param path - csv文件路径
7/// @param has_header - 是否有表头
8/// @return 结果向量
9pub fn read<D>(path: &str, has_header: bool) -> Result<Vec<D>, std::io::Error>
10where
11    D: DeserializeOwned,
12{
13    // 初始化结果向量
14    let mut result = Vec::new();
15    // 初始化csv读取器
16    let mut rdr = csv::ReaderBuilder::new()
17        .has_headers(has_header)
18        .from_path(path)?;
19    for row in rdr.deserialize() {
20        let row: D = row?;
21        result.push(row);
22    }
23
24    Ok(result)
25}
26
27/// 读取csv数据,解析成结构体
28/// @param path - csv文件路径
29/// @return 结果向量
30pub fn read_header<D>(path: &str) -> Result<D, std::io::Error>
31where
32    D: DeserializeOwned,
33{
34    // 初始化csv读取器
35    let mut rdr = csv::ReaderBuilder::new()
36        .has_headers(false)
37        .from_path(path)?;
38    // 读取数据第一行,表头记录
39    let row = rdr
40        .deserialize::<D>()
41        .into_iter()
42        .next()
43        .ok_or(Error::new(ErrorKind::Other, "No data found"))?;
44    let row: D = row?;
45    Ok(row)
46}