2010-08-29 62 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

讀取流中的每一行,圖中,如果它是一條線的興趣,輸出到下一個步驟。

看起來您只需要在第一個逗號之前獲取前導字符作爲比較值,因此可能不需要完整解析,只需從開始到第一個索引使用逗號字符選擇一個子字符串即可。

然後,您使用該選定的字符串作爲查找功能中的一個參數,用於保存所需值的集合。如果它找到它,將它作爲輸出發送到之後需要的任何過程。

如果它不僅僅是第一個位置,您將需要標記字符串,如其他地方所述。