8 个版本 (4 个重大更新)

0.5.1 2024 年 4 月 21 日
0.5.0 2024 年 1 月 13 日
0.4.1 2023 年 11 月 29 日
0.4.0 2023 年 10 月 30 日
0.1.0 2023 年 9 月 5 日

编码 中排名 1554

Download history 27/week @ 2024-04-28 25/week @ 2024-05-05 31/week @ 2024-05-12 38/week @ 2024-05-19 26/week @ 2024-05-26 28/week @ 2024-06-02 22/week @ 2024-06-09 36/week @ 2024-06-16 34/week @ 2024-06-23 5/week @ 2024-06-30 9/week @ 2024-07-07 27/week @ 2024-07-14 22/week @ 2024-07-21 24/week @ 2024-07-28 20/week @ 2024-08-04 21/week @ 2024-08-11

每月下载 91
8crate中使用(直接使用 4 个)

MIT/Apache

250KB
6K SLoC

IROX CSV 编码/解码器

受 Python 的 csv 模块启发,一个非常基础的 csv 读取和写入模块。

该库的主要用途是与无结构、结构可变或不明确的结构数据交互。因此,你可能希望使用更强大、实现更好的 csv crate

目标

  • 提供一种基于 String 的机制来读取和写入符合 rfc4180 格式的 CSV 文件。
  • 能够弹性地处理混合格式,例如引号内的不匹配和新行。

非目标

  • 对 CSV 结构内容的任何解释 - 所有一切都是拥有 String
  • serde 支持 - 如果需要,请使用 csv crate

示例

  • 直接迭代
use irox_csv::error::CSVError;

fn iter_example() -> Result<(), CSVError> {
    let mut input = irox_csv::CSVReader::new(std::io::stdin());
    loop {
        // iterate over each line of the input
        let line : Option<Vec<String>> = input.read_line()?;
        match line {
            Some(fields) => {
                // Use the individual fields of the CSV line
                println!("{:?}", fields); // fields : Vec<String>
            }
            None => {
                // EOF
                break;
            }
        }
    }
    Ok(())
}
  • 映射迭代
use irox_csv::error::CSVError;

fn map_example() -> Result<(), CSVError> {
    let mut maps = irox_csv::CSVMapReader::new(std::io::stdin());
    loop {
        // iterate over each line of the input
        let maybe_row : Option<Row> = maps.next_row()?;
        match maybe_row {
            Some(row) => {
                // Use the individual fields of the CSV line as a key-value map
                // The keys are the column headers found in the first row, the values are the matching row entry
                let map = row.into_map_lossy();
                println!("{:?}", map); // map : BTree<column:String, rowVal:String>
            }
            None => {
                // EOF
                break;
            }
        }
    }
    Ok(())
}
  • 使用映射写入 CSV 文件
fn map_writer_example() -> Result<(), CSVError> {
    let mut buf: Vec<u8> = Vec::new();
    let mut writer = CSVWriterBuilder::new()
        .with_columns(&["first", "second", "third"])
        .build(&mut buf);

    let mut map = BTreeMap::new();
    map.insert("first".to_string(), "firstColFirstRowVal".to_string());
    map.insert("second".to_string(), "secondColFirstRowVal".to_string());
    map.insert("third".to_string(), "thirdColFirstRowVal".to_string());
    writer.write_fields(&map)?;
    
    map.clear();
    map.insert("first".to_string(), "firstColSecondRowVal".to_string());
    map.insert("second".to_string(), "secondColSecondRowVal".to_string());
    map.insert("third".to_string(), "thirdColSecondRowVal".to_string());
    writer.write_fields(&map)?;
    
    Ok(())
}

将产生一个缓冲区

first,second,third
firstColFirstRowVal,secondColFirstRowVal,thirdColFirstRowVal
firstColSecondRowVal,secondColSecondRowVal,thirdColSecondRowVal

依赖