java如何获取只有迭代器的列表的“切片”?
我有一个CSV文件,里面有从Fitbit下载的数据。CSV文件中的数据遵循基本格式:
<Type of Data>
<Columns-comma-separated>
<Data-related-to-columns>
以下是文件布局的一个小示例:
Activities
Date,Calories Burned,Steps,Distance,Floors,Minutes Sedentary,Minutes Lightly Active,Minutes Fairly Active,Minutes Very Active,Activity Calories
"2016-07-17","3,442","9,456","4.41","12","612","226","18","44","1,581"
"2016-07-18","2,199","7,136","3.33","10","370","93","12","46","1,092"
...other logs
Sleep
Date,Minutes Asleep,Minutes Awake,Number of Awakenings,Time in Bed
"2016-07-17","418","28","17","452"
"2016-07-18","389","26","10","419"
现在,我使用apachecommon库中的CSVParser
来浏览这些数据。我的目标是将其转换为Java对象,将相关数据转换为Json(我需要将Json上传到其他网站)CSVParser
有一个迭代器,我可以使用它来迭代文件中的CSVRecords
。所以,基本上,我有一个所有数据的“列表”
因为该文件包含不同类型的数据(睡眠日志、活动日志等),所以我需要获得该文件的一个子列表,并将其传递到一个类中进行分析
我需要遍历列表并查找标识文件新部分的关键字(例如活动、食物、睡眠等)。一旦我确定了文件的下一部分是什么,我需要选择以下所有行,直到下一个类别
现在,对于这个问题中的问题:我不知道如何使用迭代器来获得List.sublist()
的等价物。以下是我一直在尝试的:
while (iterator.hasNext())
{
CSVRecord current = iterator.next();
if (current.get(0).equals("Activities"))
{
iterator.next(); //Columns
while (iterator.hasNext() && iterator.next().get(0).isData()) //isData isn't real, but I can't figure out what I need to do.
{
//How do I sublist it here?
}
}
}
因此,我需要确定下一个CSVRecord
是否以quote/has数据开始,并循环直到找到下一个类别,最后将文件的一个子部分(使用迭代器)传递给另一个函数,以使用正确的日志执行某些操作
编辑
我考虑先用while循环将它转换成一个List
,然后再进行子列表,但这似乎是浪费。如果我错了,请纠正我
此外,我不能假设每个部分后面都有相同数量的行。他们可能有相似的食物记录,但也有食物记录,它们遵循完全不同的模式。这里有两个不同的日子Foods
遵循正常模式,但食物日志却没有
Foods
Date,Calories In
"2016-07-17","0"
"2016-07-18","1,101"
Food Log 20160717
Daily Totals
"","Calories","0"
"","Fat","0 g"
"","Fiber","0 g"
"","Carbs","0 g"
"","Sodium","0 mg"
"","Protein","0 g"
"","Water","0 fl oz"
Food Log 20160718
Meal,Food,Calories
"Lunch"
"","Raspberry Yogurt","190"
"","Almond Sweet & Salty Granola Bar","140"
"","Goldfish Baked Snack Crackers, Cheddar","140"
"","Bagels, Whole Wheat","190"
"","Braided Twists Honey Wheat Pretzels","343"
"","Apples, raw, gala, with skin - 1 medium","98"
"Daily Totals"
"","Calories","1,101"
"","Fat","21 g"
"","Fiber","13 g"
"","Carbs","202 g"
"","Sodium","1,538 mg"
"","Protein","28 g"
"","Water","24 fl oz"
# 1 楼答案
做你想做的事情最简单的方法就是简单地记住以前的分类数据,当你点击一个新的分类时,处理以前的分类数据并为下一个分类重置。这应该起作用:
然后:
上面假设
List<List<String>>
是您想要处理的数据结构,但是您可以根据需要进行调整。我甚至建议将List<Iterable<String>>
传递给process方法(CSVRecord
实现Iterable<String>
),并在那里处理行数据这肯定可以进一步清理,但它应该让你开始