Java 我该怎么取“a”呢;切片;一个只有迭代器的列表?

Java 我该怎么取“a”呢;切片;一个只有迭代器的列表?,java,list,csv,fitbit,apache-commons-csv,Java,List,Csv,Fitbit,Apache Commons Csv,我有一个CSV文件,里面有从Fitbit下载的数据。CSV文件中的数据遵循基本格式: <Type of Data> <Columns-comma-separated> <Data-related-to-columns> 现在,我使用Apache Common库中的CSVParser来浏览这些数据。我的目标是将其转换为Java对象,将相关数据转换为Json(我需要将Json上传到其他网站)CSVParser有一个迭代器,我可以使用它来迭代文件中的CSVReco

我有一个CSV文件,里面有从Fitbit下载的数据。CSV文件中的数据遵循基本格式:

<Type of Data>
<Columns-comma-separated>
<Data-related-to-columns>
现在,我使用Apache Common库中的
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 data开头,并循环直到找到下一个类别,最后将文件的一个子部分(使用迭代器)传递给另一个函数,以使用正确的日志执行某些操作

编辑 我考虑先将其转换为带有while循环的
列表
,然后再进行子列表,但这似乎是浪费。如果我错了,请纠正我

此外,我不能假设每个部分后面都有相同数量的行。他们可能有相似的食物记录,但也有食物记录,它们遵循完全不同的模式。这里有两个不同的日子<代码>食品遵循正常模式,但食品日志不遵循正常模式

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"

做你想做的事情最简单的方法就是简单地记住以前的分类数据,当你点击一个新的分类时,处理以前的分类数据并为下一个分类重置。这应该起作用:

String categoryName = null;
List<List<String>> categoryData = new ArrayList<>();
while (iterator.hasNext()) {
    CSVRecord current = iterator.next();
    if (current.size() == 1) { //start of next category
        processCategory(categoryName, categoryData);
        categoryName = current.get(0);
        categoryData.clear();
        iterator.next(); //skip header
    } else { //category data
        List<String> rowData = new ArrayList<>(current.size());
        CollectionUtils.addAll(rowData, current.iterator()); //uses Apache Commons Collections, but you can use whatever
        categoryData.add(rowData);
    }
}
processCategory(categoryName, categoryData); //last category of file
String categoryName=null;
List categoryData=new ArrayList();
while(iterator.hasNext()){
CSVRecord current=iterator.next();
如果(current.size()==1){//开始下一个类别
processCategory(categoryName,categoryData);
categoryName=current.get(0);
categoryData.clear();
迭代器.next();//跳过标题
}else{//类别数据
List rowData=newarraylist(current.size());
CollectionUtils.addAll(rowData,current.iterator());//使用Apache Commons集合,但您可以使用任何
categoryData.add(行数据);
}
}
processCategory(categoryName,categoryData)//最后一类文件
然后:

void processCategory(String categoryName, List<List<String>> categoryData) {
    if (categoryName != null) { //first category of the file, skip
        //do stuff
    }
}
void processCategory(字符串categoryName,列表categoryData){
如果(categoryName!=null){//文件的第一个类别,则跳过
//做事
}
}
上面假设
列表是您想要处理的数据结构,但是您可以根据需要进行调整。我甚至建议只需将
List
传递给process方法(
CSVRecord
implements
Iterable
)并在那里处理行数据


这当然可以进一步清理,但应该可以让您开始。

如果我在您的位置,我会使用一些结构化数据友好的东西,如Bean.io。这个API对我来说太低了。另一方面。如果您想使用List.sublist(),为什么不创建一个ArrayList并用迭代器的内容填充它呢?这是一个有点幼稚的解决方案,但您已经说过您已经准备好使用子列表了。@AlexanderPetrov我考虑过它,但它似乎是浪费。不管怎样,我问题的另一部分是正确的。我不确定如何确定文件的哪些部分要再列出。如果我正确理解“2016-07-17”、“3442”、“9456”、“4.41”、“12”、“612”、“226”、“18”、“44”、“1581”是一个单独的CSVRecord和“2016-07-18”、“2199”、“7136”、“3.33”、“10”、“370”、“93”、“12”、“46”、“1092”也是一个单独的CSV记录,因此基本上每2个非列表部分后都有一个列表部分。此外,每个列表部分都以日期开头。@AlexanderPetrov更正。每个都是它自己的
CSVRecord
但是,它们的行数并不总是相同的。
void processCategory(String categoryName, List<List<String>> categoryData) {
    if (categoryName != null) { //first category of the file, skip
        //do stuff
    }
}