我有一个继承的项目,它解析来自不同来源的二进制和ascii数据流(固定重复长度二进制流,固定重复长度ascii流,变量重复长度但固定数量的字段csv像ascii溪流)。它已经运行时可配置为在哪个输入端口上期望每种输入格式,定义固定长度和每组字节应该根据位置解析,或者对于可变长度1,哪个字节或一组应将字节视为记录分隔符和字段分隔符,并将字段分隔符之间的每个字段解析为。每个流的格式在运行时之前是已知的,并在基于ascii的配置文件中进行了描述。
但是我现在需要这个更通用的处理基本上是一种语法或一种语法的新输入设备。当设备正常运行时,它以下列行格式输出,每秒一行:
6.53米,48.31%
但是当设备检测到超出范围的错误情况时,它会输出
999999
我目前的可配置级别(继承的代码)不允许我处理这个问题,因为它首先不是固定的长度,也不是每个"记录"它都有一致数量的字段分隔符。 ,即每行。
我需要一个解析器配置系统,让我说"如果记录中有2个字段然后解析一个浮点数,后跟一个字符串常量' m',然后是一个浮点数通过字符串常量'%&#39 ;;如果记录中只有一个字段,则解析一个int"。
如果有人知道任何已解决此类需求的软件包,我将非常感谢指向它们。显然我已经用Google搜索了,但我可能没有使用这种类型的可配置解析器的正确术语,所以谷歌搜索并没有非常富有成效。
答案 0 :(得分:1)
您可以使用普通的sscanf
和朋友来解析此问题。 sscanf
返回成功转换的字段数,您可以使用它来确定是否正确解析了该行。这甚至不需要花哨的解析器生成器!
示例程序:
#include <stdio.h>
int main() {
char line[256];
while(fgets(line, 256, stdin)) {
float f1, f2;
int d1;
if(sscanf(line, "%fm,%f%%", &f1, &f2) == 2) {
printf("f1 = %f, f2 = %f\n", f1, f2);
} else if(sscanf(line, "%d", &d1) == 1) {
printf("d1 = %d\n", d1);
} else {
printf("Unrecognized input.\n");
}
}
return 0;
}
示例会话:
6.53m,48.31%
f1 = 6.530000, f2 = 48.310001
999999
d1 = 999999
blah
Unrecognized input.