我正在尝试构建一种扫描程序,它会遍历导出的数据库并创建有关已找到的特定项目的统计信息。导出文件的结构如下:
^
property1: value1
property2: value4
^
property1: value5
property2: value7
^
property3: value2
property1: value6
在这个例子中,我想知道property1有多少数据集有值5?
^是一个字节序列,用于标记新数据集的开头。问题是属性有时不存在于一个数据集中,或者属性中的顺序不同。
目前,我正在浏览每个数据集并遍历每一行,并检查该行是否以所需属性开头,但我觉得它可以做得更漂亮,效率更高。
public static Order getNextOrder(StreamReader sr){
String myLine = "";
String prop1 = "";
while(!myLine.StartsWith("^") && myLine!=null){
myLine = sr.ReadLine();
if(myLine.StartsWith("prop1")){
prop1 = myLine.Split(':')[1].Trim();
continue;
}
}
if(myLine==null)
isFinished = true;
var order = new Order(prop1);
if(OrderFilter.accepted(order))
return order;
return null;
}
答案 0 :(得分:1)
只要文件仍然很小并且您想要询问的有关该文件的问题数量有限,您所做的事情看起来就会很好。
基本上将文件解析为结构化数据,然后查询数据。在您的情况下,逐行读取文件并将它们放入Order
对象中,这些对象可能会进入数组,您可以对其进行一些分析。更复杂的解决方案只是这个主题的变体。
例如,您可以将数据流式传输到擅长此类数据分析的数据库,例如弹性搜索。然后,您可以对数据执行各种有趣的查询,而无需编写除流式解析器之外的任何代码。
如果您的文件变得如此之大以至于您无法在合理的时间内处理它或者将其全部加载到内存中,或者您需要让非程序员能够对其进行任意查询数据,那么你可能需要将它放入ES中,否则你正在做的事情看起来很好。