我在文本文件中有一堆cars_information行,其属性为:year make model color。
然而,属性可以是任何顺序,或者它们可能存在也可能不存在。
将这些attr解析为单个列的最佳方法是什么?
另外,有没有关于解析不一致行的主题的理论?
答案 0 :(得分:2)
如果不同属性的有效值范围不重叠,则值本身会告诉您它所引用的属性。例如"丰田"只能是品牌,而不是一年,模特或颜色。如果对于所有可能的属性值都是如此,那么您不需要依赖于该字段的顺序。
解析有两种常用方法:语法驱动或输入驱动。如果您的数据具有一致的表单,那么您可以选择语法驱动的方法。但是既然你没有这个,你必须使用输入驱动的方法。基本上,你坐在一个循环中,阅读下一个"令牌"从输入中找出它是什么类型的标记,然后为" current"设置适当的属性。汽车。当你到达记录分隔符时,输出"当前"汽车,然后将当前汽车重置为默认值。
这样的事情:
CarInfo current_car;
current_car.Reset(); // sets the fields to default empty values
while (token = GetNextToken()) {
if (token is a record separator) {
Output(current_car);
current_car.Reset();
} else if (token is a make) {
current_car.SetMake(token);
} else if (token is a year) {
current_car.SetYear(token);
} ...
}
如果您的值存在重叠,例如" 2000"可能是一年或者它可能是一些假想汽车的模型,那么你必须添加一个启发式,它需要一个有根据的猜测来确定类型。也许你会检查并查看年份字段是否已经设置,或者制造商是否已经设置,并且您知道特定制造商有一个名为2000的模型。希望您不必编写太多的规则,例如此