2010-08-29 65 views
0

我正在使用java的CSV。我有一个问题,或者你可以说我不知道​​该怎么 办呢:)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包含数千行和列。

+0

你能证明你所尝试过的吗?它有什么问题? – 2010-08-29 21:57:41

+0

我还没有尝试过任何东西。只需读取文件并在StringBuilder中加载csv文件即可。我不是java向导:( – Tweet 2010-08-29 22:00:55

回答

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) 
+0

非常感谢!! – Tweet 2010-08-29 23:27:19

0

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

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

+0

感谢您的回答,是不是慢解决方案?我有大量的CSV文件,它会杀死我的处理速度,因为对于每个值,我必须读取整个CSV匹配,找到行然后第二值....等等。 – Tweet 2010-08-29 22:03:37

+0

除非您知道某些关于数据的具体内容(例如,已订购),否则无法避免读取整个内容进行过滤。 您不必多次阅读CSV:因为你可以检查所有可能的第一个值,如krmby的代码所示。 – 2010-08-30 15:32:13

0

读取流中的每一行,图中,如果它是一条线的兴趣,输出到下一个步骤。

看起来您只需要在第一个逗号之前获取前导字符作为比较值,因此可能不需要完整解析,只需从开始到第一个索引使用逗号字符选择一个子字符串即可。

然后,您使用该选定的字符串作为查找功能中的一个参数,用于保存所需值的集合。如果它找到它,将它作为输出发送到之后需要的任何过程。

如果它不仅仅是第一个位置,您将需要标记字符串,如其他地方所述。