#csv #utf-8 #comma #delimited

simple_csv

简单的 CSV 解析实现

12 个版本

使用旧的 Rust 2015

0.0.15 2015年4月22日
0.0.14 2015年4月22日
0.0.13 2015年2月25日
0.0.11 2015年1月29日
0.0.4 2014年12月28日

#6 in #delimited

50 个月下载量
crate-race 中使用

MIT 许可证

34KB
695

简单 CSV 库

Build status

这是一个 CSV(分隔符可更改)解析器和编写器,重点在于

  1. 简单性
  2. 健壮性
  3. 性能(程度较低)

解析器

解析器遵循 RFC 4180,但允许处理不符合规范的文件。

为了实现这种健壮性,解析器做出了以下假设

  1. 行尾的逗号导致该列的结果为空字符串。 * 1,2,3, 解析为 ["1","2","3",""]
  2. 字段中的双引号,如果不被双引号包围,则作为普通字符处理,并包含在列字符串中。 * 1,2",3 解析为 ["1","2\"","3"]
  3. 紧跟在引号字段后面的非分隔符字符被视为列数据的一部分,并将其附加到列字符串上。* 以下代码 1,2,"3"123 被解析为 ["1","2","3123"]
  4. 在引号字段中间的 EOF 被解析为字段已正确关闭。* 以下代码 1,2,"3*EOF* 被解析为 ["1","2","3"]
  5. 空行或每行列数不同均不会产生错误。* 空行被解析为 [""]
  6. 假设行是 UTF8 编码的,并且通过 Rust 的 String::from_utf8_lossy 函数“有损”解码。
  7. 未引号字段中的回车符 \r 总是被丢弃。

写入器

写入器总是产生符合 RFC 4180 的输出,并且可以将数据写入实现了 std::io::Writer 特性的任何对象。

用法

添加到您的 Cargo.toml 中

[dependencies]
simple_csv = "~0.0.8"

简单的 CSV 解析用法

let test_string = "1,2,3\r\n4,5,6".to_string();
let bytes = test_string.into_bytes();
let test_csv_reader = &*bytes;

let mut reader = SimpleCsvReader::new(test_csv_reader);

assert_eq!(reader.next_row(), Ok(&*vec!["1".to_string(),"2".to_string(),"3".to_string()]));
assert_eq!(reader.next_row(), Ok(&*vec!["4".to_string(),"5".to_string(),"6".to_string()]));
assert!(reader.next_row().is_err());

不同的分隔符

let test_string = "1|2|3\r\n4|5|6".to_string();
let bytes = test_string.into_bytes();
let test_csv_reader = &*bytes;
let mut csv_options: SimpleCsvReaderOptions = Default::default();
csv_options.delimiter = '|';
let mut reader = SimpleCsvReader::with_options(test_csv_reader,csv_options);

assert_eq!(reader.next_row(), Ok(&*vec!["1".to_string(),"2".to_string(),"3".to_string()]));
assert_eq!(reader.next_row(), Ok(&*vec!["4".to_string(),"5".to_string(),"6".to_string()]));
assert!(reader.next_row().is_err());

使用迭代器

let test_string = "1,2,3\r\n4,5,6".to_string();
let bytes = test_string.into_bytes();
let test_csv_reader = &*bytes;

let mut reader = SimpleCsvReader::new(test_csv_reader);

for row in reader {
	println!("{}",row);
}

不同的文本封装字符

let test_string = "1,#2#,3\r\n#4#,5,6".to_string();
let bytes = test_string.into_bytes();
let test_csv_reader = &*bytes;
let mut csv_options: SimpleCsvReaderOptions = Default::default();
csv_options.text_enclosure = '#';
let mut reader = SimpleCsvReader::with_options(test_csv_reader,csv_options);

assert_eq!(reader.next_row(), Ok(&*vec!["1".to_string(),"2".to_string(),"3".to_string()]));
assert_eq!(reader.next_row(), Ok(&*vec!["4".to_string(),"5".to_string(),"6".to_string()]));
assert!(reader.next_row().is_err());

简单的 CSV 写入用法

let mut vec = Vec::new();
let mut writer = SimpleCsvWriter::new(vec);
let _ = writer.write_all(&vec![
    vec!["1".to_string(),"2".to_string(),"3".to_string()],
    vec!["4".to_string(),"5".to_string(),"6".to_string()]]);
vec = writer.as_inner();

let test_string = "1,2,3\n4,5,6";
assert_eq!(vec, test_string.as_bytes());

待办事项

  • 允许迭代器方法返回错误

无运行时依赖

特性