2010-08-29 3 views
0

Я работаю с CSV в java. Я имею одну проблему, или вы можете сказать, что я не знаю, как сделать это :)Разделение строк в CSV Java

У меня есть 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

Можете ли вы показать, что вы пробовали? В чем была проблема? –

+0

Я еще ничего не пытался. Просто прочитайте файл и загрузите файл csv в StringBuilder. Я не java-мастер :( – Tweet

ответ

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

0

Поскольку CSV представляет собой неструктурированный формат, а строки не упорядочены, единственный способ решить проблему - прочитать каждую строку кода и решить, сохранять ли его.

Сначала вы должны прочитать строку из файла (используйте InputStream/BufferedReader и т. Д.), Затем используйте StringTokenizer для разделения по запятым, и вы можете найти первую часть, следует ли ее выбирать.

+0

Спасибо за ваш ответ. Разве это не медленное решение? У меня есть файлы BIG CSV, которые убьют мою скорость обработки. Потому что для каждого значения мне нужно прочитать полное соответствие CSV и найти строки, значение .... так и так далее. – Tweet

+0

Вы не можете избежать чтения всего содержимого для фильтрации, если только не знаете что-то конкретное о данных (например, оно упорядочено). Вам не обязательно читать CSV несколько раз: так как вы можете проверить все возможные первые значения, как показано в коде от krmby. –

0

Читайте каждую строку в потоке, цифра, если это линия интерес, вывод к следующему шагу.

Похоже, что вам нужно только получить первые символы перед первой запятой в качестве значения для сравнения, поэтому полный разбор может не понадобиться, просто подстрока, выбранная от начала до первого индекса с запятой.

Затем вы используете эту выбранную строку в качестве параметра в функции поиска, содержащей вашу коллекцию желаемых значений. Если он найдет его, отправьте его как результат на тот процесс, который вам понадобится после этого.

Если его больше, чем только первая позиция, вам нужно будет токенизировать строку, как указано в другом месте.

Смежные вопросы