Java CSV行分离

时间:2010-08-29 21:55:01

标签: java parsing csv matrix

我在java中使用CSV。我有一个问题,或者你可以说我不知道​​怎么回事 这样做:)

我有一个CSV文件,如下所示:

a,4,5,3,2
b,6,4,6,7
c,5,3,7,2
2d,1,4,5,9
4e,4,2,5,7
m4,7,5,3,6
.
.
.
xyz,1,6,4,8

我希望首先从CSV中获取包含以下这些标签的所有行 列,我在ArrayList

中都有以下第一列标签
a
c
2d
m4
xyz

结果应为:

a,4,5,3,2
c,5,3,7,2
2d,1,4,5,9
m4,7,5,3,6
xyz,1,6,4,8

非常感谢!

P.S:我的CSV包含数千行和列。

3 个答案:

答案 0 :(得分:0)

由于CSV是非结构化格式,并且行没有排序,解决问题的唯一方法是读取代码的每一行并决定是否保留它。

首先,您应该从文件中读取一行(使用InputStream / BufferedReader等),然后使用StringTokenizer以逗号分割,您可以查找第一部分是否应该选择它。

答案 1 :(得分:0)

这就是你所需要的。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

    final private static List<String> lines = Arrays.asList(
            "a,4,5,3,2",
            "b,6,4,6,7",
            "c,5,3,7,2",
            "2d,1,4,5,9",
            "4e,4,2,5,7",
            "m4,7,5,3,",
            "xyz,1,6,4,8");
    final private static List<String> labelsInFirstColumn = Arrays.asList(
            "a",
            "c",
            "2d",
            "m4",
            "xyz");

    public static void main(String[] args) {

        List<String[]> result = new ArrayList<String[]>();

        for (String line : lines) {

            String columns[] = line.split("[,]");

            if (labelsInFirstColumn.contains(columns[0])) {

                result.add(columns);

            }

        }

        for (String[] selectedLine : result) {
            for (String column : selectedLine) {
                System.out.print(column + " | ");
            }
            System.out.println();
        }
    }
}

这是输出:

run:
a | 4 | 5 | 3 | 2 | 
c | 5 | 3 | 7 | 2 | 
2d | 1 | 4 | 5 | 9 | 
m4 | 7 | 5 | 3 | 
xyz | 1 | 6 | 4 | 8 | 
BUILD SUCCESSFUL (total time: 1 second)

答案 2 :(得分:0)

读取流中的每一行,确定它是否为感兴趣的行,输出到下一步。

看起来你只需要将第一个逗号之前的前导字符作为比较值,因此可能不需要完整的解析,只需要从逗号char开始到第一个indexof选择的子字符串。

然后,您可以将所选字符串用作包含所需值集合的查找函数中的参数。如果找到它,请将其作为输出发送到之后您需要的过程。

如果它不仅仅是第一个位置,你需要对字符串进行标记化,如其他地方所述。