2 个版本
0.1.1 | 2023 年 8 月 9 日 |
---|---|
0.1.0 | 2023 年 8 月 7 日 |
#1625 in 文本处理
19KB
226 行
TextBlocks
一个用于解析文本块的简单包。可用于解析由空行分隔的数据块的文本文件。适用于 \n 或 \r\n 行结束符。
包含 TextBlocks
特性,为 str
和 String
添加了 as_blocks
、block_parse_lines
和 block_parse
方法。
安装
在您的项目目录中运行以下命令
cargo add textblocks
或者将以下内容添加到您的 Cargo.toml
[dependencies]
textblocks = "0.1.0"
查看 crates.io 页面以获取最新版本。
用法
要解析文本为块,您需要提供块分隔符、行解析器和块解析器。
- 块分隔符是分隔块的字符串。默认为空白行(双换行符),但可以使用任何字符串。
BlockDelimiter::DoubleLineGeneric
(默认)将使用"\r\n\r\n"
如果字符串包含"\r\n"
换行符,否则使用"\n\n"
。BlockDelimiter::Delimiter(s)
将使用s
(一个String
)作为分隔符。
- “行解析器”是任何接收一个
&str
并返回类型为T
的值的函数或闭包。最终结果将是一个Vec<Vec<T>>
的向量。如果您不需要块解析器,只想解析行,可以使用block_parse_lines
方法。 - “块解析器”是任何接收一个
&[T]
并返回类型为U
的值的函数或闭包。最终结果将是一个Vec<U>
的向量。
示例
- 将块解析为一个行向量
[!重要] 这将分配一个字符串向量的向量。如果您想避免这些分配,请使用
block_parse_lines
或block_parse
。在这种情况下,只将为请求的结果类型分配一个向量。
use textblocks::*;
let s = "100\n200\n\n300\n400\n\n500\n600";
let block_delimiter = BlockDelimiter::DoubleLineGeneric;
assert_eq!(s.as_blocks(&block_delimiter), vec![vec!["100", "200"], vec!["300", "400"], vec!["500", "600"]]);
assert_eq!(s.as_blocks(&block_delimiter), [["100", "200"], ["300", "400"], ["500", "600"]]);
- 将块解析为一个行向量,其中每行被解析为一个数字(u32)
use textblocks::*;
let s = "100\n200\n\n300\n400\n\n500\n600";
let block_delimiter = BlockDelimiter::DoubleLineGeneric;
let result = s.block_parse_lines(&block_delimiter,|line| line.parse::<u32>().unwrap());
assert_eq!(result, [[100, 200], [300, 400], [500, 600]]);
- 将块解析为一个行向量,其中每行被解析为一个数字(u32),然后对这些数字求和
use textblocks::*;
let s = "100\n200\n\n300\n400\n\n500\n600";
let block_delimiter = BlockDelimiter::DoubleLineGeneric;
let result = s.block_parse(
&block_delimiter,
|line| line.parse::<u32>().unwrap(),
|block| block.iter().sum::<u32>()
);
assert_eq!(result, [300, 700, 1100]);