2 个版本

0.1.1 2023 年 8 月 9 日
0.1.0 2023 年 8 月 7 日

#1625 in 文本处理

MIT 许可证

19KB
226

TextBlocks

Rust Release Dependency status crates.io Downloads crates.io

一个用于解析文本块的简单包。可用于解析由空行分隔的数据块的文本文件。适用于 \n 或 \r\n 行结束符。

包含 TextBlocks 特性,为 strString 添加了 as_blocksblock_parse_linesblock_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_linesblock_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]);

无运行时依赖