2014-02-02 4 views
0

Вот пример CSV-файла:supercsv как получить массив значений столбца по имени столбца

CustomerNo, ПгвЬЫате, LastName, BirthDate, mailingAddress, женат, numberOfKids, favouriteQuote, электронная почта, loyaltyPoints

1, John, Dunbar, 13/06/1945, «1600 Amphitheatre Parkway Mountain View, CA 94043 Соединенные Штаты" ,,, "" "Пусть Сила будет с вами." "- Звездные войны", jdunbar @ gmail.com, 0
2, Bob, Down, 25/02/1919, "1601 Willow Rd. Menlo Park, CA 94025 Соединенные Штаты", Y, 0, "" "Честно говоря, моя дорогая, мне наплевать , «« Унесенные ветром », bobdown @ hotmail.com, 123456

Для exmaple, как я могу получить, чтобы все значения столбца принадлежали lastName?
Я ожидаю, что результатом будет [Dunbar, Down].

Я попытался найти документ, но не нашел полезного примера.

Еще один вопрос: в чем смысл метода getLineNumber()? Я прочитал документ, и он говорит: «Получает текущую позицию в файле. Первая строка файла - это номер строки 1.« Но я все еще запутался.

+0

Вы только хотите получить фамилию от csv? – Kick

+0

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

ответ

1

У вас есть несколько вариантов. Я использовал CsvListReader, но вы могли бы просто использовать CsvMapReader или CsvBeanReader.

Вы можете использовать процессор Collector клеток:

private static final String CSV = "firstName,lastName\nJohn,Dunbar\nBob,Down"; 

@Test 
public final void testCollector() throws IOException { 
    ICsvListReader reader = new CsvListReader(new StringReader(CSV), 
     CsvPreference.STANDARD_PREFERENCE); 
    reader.getHeader(true); // skip header 

    // Collector processor 'collects' values from a column 
    List<Object> firstNames = new ArrayList<Object>(); 
    CellProcessor[] processors = {new Collector(firstNames), null}; 

    while(reader.read(processors) != null){ 
     // just keep reading - Collector will collect the values 
    } 

    // prints: [John, Bob] 
    System.out.println(firstNames); 
} 

Или возьмите соответствующую колонку после Супер CSV прочитал каждую строку:

@Test 
public final void testManual() throws IOException { 
    ICsvListReader reader = new CsvListReader(new StringReader(CSV), 
     CsvPreference.STANDARD_PREFERENCE); 
    reader.getHeader(true); // skip header 

    List<String> firstNames = new ArrayList<String>(); 

    List<String> line; 
    while((line = reader.read()) != null){ 
     firstNames.add(line.get(0)); 
    } 

    // prints: [John, Bob] 
    System.out.println(firstNames); 
} 

В любом случае вам нужно прочитать весь файл CSV - это не электронная таблица, и вы не можете просто просто захватить все значения в конкретном столбце (записи могут занимать более 1 строки!). Это подводит меня к следующему вопросу ...

Прямо из Javadoc:

getLineNumber(): Возвращает текущую позицию в файле. Первая строка файла - номер строки.

getRowNumber(): Получает номер текущей строки (то есть количество записей CSV, включая заголовок, которые были прочитаны). Это отличается от строки LineNumber, которая представляет собой число реальных строк, которые были прочитаны в файле. Первая строка - это строка 1 (обычно это строка заголовка).

0

Если вы можете прочитать каждую строку CSV с Readline например, просто разделить строку и прочитать колонку 2.

String[] csvLine = getLine().split(","); 
String lastName = csvLine[2]; 
+0

, но если бы я мог получить все значения одного столбца, это было бы идеально. Например: [Dunbar, Down, Peter] – Jusleong

+0

Вы можете просто зациклиться и добавить. 'lastName + =", "+ csvLine [2]' – Jim

+0

в порядке, есть ли другой способ? – Jusleong

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