2013-11-29 3 views
0

У меня есть файл CSV, который я хотел бы хранить как объект Java. Я хотел бы, чтобы имя столбцов было первым измерением массива, а пара ключей знаменует второе измерение массива. Я пробовал разные решения (в основном LinkedHashMaps), но никто не работает должным образом.Многомерный запрос HashMap Array

CSV-выглядит следующим образом:

TimeStamp;Column 1;Column 2;Column3 
1385733406;Value1;Value12;Value13 
1385733409;Value21;Value22;Value23 
1385733411;Value31;Value32;Value33 

Я хотел бы массив выглядеть примерно так:

["Column 1"] 
    ["1385733406","Value1"] 
    ["1385733409","Value21"] 
    ["1385733411","Value31"] 
["Column 2"] 
    ["1385733406","Value2"] 
    ["1385733409","Value22"] 
    ["1385733411","Value32"] 
["Column 3"] 
    ["1385733406","Value2"] 
    ["1385733409","Value22"] 
    ["1385733411","Value33"] 

Таким образом, я смог бы запросить объект и восстановить все значения пары ключей из данного столбца, например, все данные из столбца 1. Использование HashMaps не работает, потому что они требуют двух аргументов, и это не похоже на правильный путь. Это код, который я мог бы придумать до сих пор, и я не думаю, что это правильный трек, но это все, что я мог придумать. Я использую OpenJDK 1.7

public class CsvCollection { 
    public Map<String,Map<String,Integer>> Results = new LinkedHashMap<String, Map<String,Integer>>(); 

    public CsvCollection(){ 

    } 

    public void parseCsvResultFile(File csvFile){  
     CSVReader reader = null; 
     List myEntries = null; 
     try { 
      reader = new CSVReader(new FileReader(csvFile.getAbsolutePath()), ';'); 
     } catch (FileNotFoundException e) { 
      System.out.println("Error opening [], aborting parsing"); 
     } 
     try { 
      myEntries = reader.readAll(); 
     } catch (IOException e) { 
      System.out.println("Error reading content of CSV file (but file was opened)"); 
     } 

     for(String header: (String[]) myEntries.get(0)){ 
      Results.put(header, null); 
      // What now? 
     }  
    } 
} 
+1

Выглядит нормально для меня. В основном это либо создание собственной пользовательской структуры данных с помощью POJO. Что заставляет вас думать, что это неправильное решение? – t0mppa

+0

Я добавляю «Results.put (header, null»), поэтому я не уверен, что это сделает действительно многомерный массив. – Astaar

ответ

2

Вы можете сделать 2 изменения следующим образом, чтобы реализовать нужную вам функцию.

1) Измените следующий код

public Map<String,Map<String,Integer>> Results = new LinkedHashMap<String, Map<String,Integer>>(); 

в

public Map<String, List<String[]>> Results = new LinkedHashMap<String, List<String[]>>(); 

Это изменение сделано потому, что для столбца указать, как Колонка 1, он имеет 3 строки с Timestamp и соответствующее значение столбца. Вам необходимо использовать Список для их хранения.

2) Измените следующие для цикла

for(String header: (String[]) myEntries.get(0)){ 
     Results.put(header, null); 
     // What now? 
    } 

в

String[] headerColumns = (String[]) myEntries.get(0); 
    // First column is TimeStamp, skip it 
    for (int i = 1; i < headerColumns.length; i++) { 

     List<String[]> list = new ArrayList<String[]>(); 
     for (int rowIndex = 1; rowIndex < myEntries.size(); rowIndex++) { 
      String[] row = (String[]) myEntries.get(rowIndex); 
      list.add(new String[] { row[0], row[i] }); 
     } 

     Results.put(headerColumns[i], list); 
    } 

С выше 2 изменений, если распечатать результаты (тип карт < строки, список < String [] >>) в консоли, используя следующий код,

for(Map.Entry<String, List<String[]>> entry : Results.entrySet()) 
    { 
     System.out.printf("[%s]\n",entry.getKey()); 
     for(String[] array : entry.getValue()) 
     { 
      System.out.println(Arrays.toString(array)); 
     } 
    } 

вы получите сообщение л вам нужно:

[Column 1] 
[1385733406, Value1] 
[1385733409, Value21] 
[1385733411, Value31] 
[Column 2] 
[1385733406, Value12] 
[1385733409, Value22] 
[1385733411, Value32] 
[Column3] 
[1385733406, Value13] 
[1385733409, Value23] 
[1385733411, Value33] 

Примечание: в приведенном выше примере выполняется с использованием содержимого из CSV файла ниже:

TimeStamp;Column 1;Column 2;Column3 
1385733406;Value1;Value12;Value13 
1385733409;Value21;Value22;Value23 
1385733411;Value31;Value32;Value33 
+0

Это ТОЧНО, что я хотел сделать, спасибо вам большое :) Я застрял, потому что мой мозг настаивал на том, что я делаю Results.put() перед двумя другими петлями, которые в ретроспективе были очень глупыми из меня. Из-за этого я застрял, и это могло длиться дольше, пока я не отклеился! Большое спасибо! – Astaar

+0

Добро пожаловать. Рад, что это тебе помогает. Тогда двигайтесь вперед. :) – MouseLearnJava

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