解析java中的拆分c​​sv文件

时间:2014-04-12 03:09:43

标签: java csv

我有一个带注释的csv文件,其值必须在两个ArrayLists之间拆分。例如:

% the values below here should go
% into ArrayList<Integer> list1
3,4,5,2,2,3
5,6,3,2,4,5
3,2,3,4,5,6
2,3,4,5,1,3
% the values below here should go
% into ArrayList<Integer> list2
4,6,3,4,5,3
3,4,5,6,3,2
4,5,6,4,3,2

实现这一目标的最佳方法是什么?我应该使用每次状态从%变为值时递增的计数器,反之亦然,然后如果计数器%2 = 0,那么添加一个新的ArrayList并开始写入?这是我能想到的唯一方法,但看起来有点笨拙,其他人有更好的想法吗?

编辑:我已经编写了实际解析csv值的代码,我不需要帮助,只是想知道如何将值拆分为两个列表..

1 个答案:

答案 0 :(得分:0)

你的建议听起来不错。如果文件格式真的如此可预测,那么任何更复杂的方法在我看来可能都是过度的。

但是如果你想看到不同的方法,这就是我的想法:每个不以%开头的行都是我们要解析为ArrayList的东西。因此,每当您遇到不是注释的行时,您就会开始将以下行解析为ArrayList,直到您点击另一个注释或文件末尾。这两个选项都标记了要存储在一个ArrayList中的零件的末尾。所以,像这样:

ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> currentArray;
while(inputStream.hasNextLine()) {
    String line = inputStream.getLine();
    if(!lineIsComment(line)) {
        // This means that we are in a number block. We store the numbers
        // either in an existing list or create a new one if necessary
        if(currentArray == null) {
            currentArray = new ArrayList<Integer>();
        }
        addToList(line, currentArray);
    } else if(currentArray != null) {
        // In this case a comment block starts and currentArray contains
        // the numbers of the last number block.
        arrays.add(currentArray);
        currentArray = null;
    }
}
if(currentArray != null) arrays.add(currentArray);

其中lineIsComment(String line)返回一个布尔值,指示给定的行是否为注释,addToList(String line, ArrayList<Integer> list)使用您的方法解析一行数字并将它们存储在提供的列表中。