Parsing 如何解析值顺序不一致的行?

Parsing 如何解析值顺序不一致的行?,parsing,Parsing,我在一个文本文件中有一堆汽车信息行,其中包含属性:年份制作模型颜色 但是,属性可以是任意顺序的,也可以是不存在的 将这些属性解析为单个列的最佳方法是什么 另外,有没有关于解析不一致行的理论?如果不同属性的有效值范围不重叠,那么值本身会告诉您它所指的属性。例如,“丰田”只能是品牌,不能是年份、型号或颜色。如果所有可能的属性值都是这样,则不需要依赖于字段的顺序 解析有两种通用方法:语法驱动或输入驱动。如果您的数据具有一致的形式,那么您可以选择语法驱动的方法。但既然你没有,你就必须使用输入驱动的方法。

我在一个文本文件中有一堆汽车信息行,其中包含属性:年份制作模型颜色

但是,属性可以是任意顺序的,也可以是不存在的

将这些属性解析为单个列的最佳方法是什么


另外,有没有关于解析不一致行的理论?

如果不同属性的有效值范围不重叠,那么值本身会告诉您它所指的属性。例如,“丰田”只能是品牌,不能是年份、型号或颜色。如果所有可能的属性值都是这样,则不需要依赖于字段的顺序

解析有两种通用方法:语法驱动或输入驱动。如果您的数据具有一致的形式,那么您可以选择语法驱动的方法。但既然你没有,你就必须使用输入驱动的方法。基本上,您坐在一个循环中,从输入中读取下一个“令牌”,找出它是什么类型的令牌,然后为“当前”汽车设置适当的属性。当到达记录分隔符时,输出“当前”车辆,然后将当前车辆重置为默认值

大概是这样的:

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的型号。希望您不必编写太多这样的规则。

您应该显示此输入的示例输入和预期输出。需要大量的测试套件,因为没有算法可以“从非常规数据中准确获取我的想法”。如果我有一辆2009年生产的标致2008会怎么样?还是绿色水银黄玉?你可能需要处理一些模棱两可的问题。。。