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 中使用
34KB
695 行
简单 CSV 库
这是一个 CSV(分隔符可更改)解析器和编写器,重点在于
- 简单性
- 健壮性
- 性能(程度较低)
解析器
解析器遵循 RFC 4180,但允许处理不符合规范的文件。
为了实现这种健壮性,解析器做出了以下假设
- 行尾的逗号导致该列的结果为空字符串。 *
1,2,3,
解析为["1","2","3",""]
- 字段中的双引号,如果不被双引号包围,则作为普通字符处理,并包含在列字符串中。 *
1,2",3
解析为["1","2\"","3"]
- 紧跟在引号字段后面的非分隔符字符被视为列数据的一部分,并将其附加到列字符串上。* 以下代码
1,2,"3"123
被解析为["1","2","3123"]
- 在引号字段中间的 EOF 被解析为字段已正确关闭。* 以下代码
1,2,"3*EOF*
被解析为["1","2","3"]
- 空行或每行列数不同均不会产生错误。* 空行被解析为
[""]
- 假设行是 UTF8 编码的,并且通过 Rust 的
String::from_utf8_lossy
函数“有损”解码。 - 未引号字段中的回车符
\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());
待办事项
- 允许迭代器方法返回错误