2015-07-01 1 views
-2

У меня есть hashmap с ключом String и значением String. Он содержит большое количество ключей и их соответствующих значений.Java - записать hashmap в файл csv

Например:

key | value 
abc | aabbcc 
def | ddeeff 

Я хотел бы написать эту HashMap в файл CSV, например, что мой файл CSV содержит строки, как показано ниже:

abc,aabbcc 
def,ddeeff 

Я попытался следующий пример здесь, используя supercsv библиотека: http://javafascination.blogspot.com/2009/07/csv-write-using-java.html. Однако в этом примере вам нужно создать хэш-карту для каждой строки, которую вы хотите добавить в файл csv. У меня есть большое количество пар ключевых значений, что означает, что необходимо создать несколько hashmaps, каждый из которых содержит данные для одной строки. Я хотел бы знать, есть ли более оптимизированный подход, который можно использовать для этого варианта использования.

Заранее благодарен!

+0

Не могли бы вы опубликовать то, что вы пробовали до сих пор (в коде)? –

+0

Где моя проблема? * Построение контента *, который является 1o1 итерации, или * запись в файл * - который является 1o1 файла FileSystemAccess? – dognose

ответ

0

Как ваш вопрос с вопросом, как сделать это с помощью супер CSV, я думал, что перезвон в (как сопровождающему проекта).

Первоначально я думал, что вы могли бы просто перебрать ввода установки карты, используя CsvBeanWriter и отображение имени массива "key", "value", но это не работает, потому что внутренняя реализация HashMap «s не позволяет отражения, чтобы получить ключ/значение.

Таким образом, ваш единственный вариант - использовать CsvListWriter следующим образом. По крайней мере, таким образом, вам не придется беспокоиться о побеге CSV (любой другой пример здесь просто соединяется с запятыми ... aaarrggh!):

@Test 
public void writeHashMapToCsv() throws Exception { 
    Map<String, String> map = new HashMap<>(); 
    map.put("abc", "aabbcc"); 
    map.put("def", "ddeeff"); 

    StringWriter output = new StringWriter(); 
    try (ICsvListWriter listWriter = new CsvListWriter(output, 
     CsvPreference.STANDARD_PREFERENCE)){ 
     for (Map.Entry<String, String> entry : map.entrySet()){ 
      listWriter.write(entry.getKey(), entry.getValue()); 
     } 
    } 

    System.out.println(output); 
} 

Выход:

abc,aabbcc 
def,ddeeff 
+0

Не могли бы вы рассказать мне, какие библиотеки мне нужно импортировать для этого? или Мне нужно написать любой другой метод для запуска или я могу использовать его как есть? –

+0

@RV_Dev http://super-csv.github.io/super-csv/downloading.html –

3

Что-то вроде этого следует сделать трюк:

String eol = System.getProperty("line.separator"); 

try (Writer writer = new FileWriter("somefile.csv")) { 
    for (Map.Entry<String, String> entry : myHashMap.entrySet()) { 
    writer.append(entry.getKey()) 
      .append(',') 
      .append(entry.getValue()) 
      .append(eol); 
    } 
} catch (IOException ex) { 
    ex.printStackTrace(System.err); 
} 
+0

Я получаю пустой файл после успешной компиляции и выполнения этого кода? Я проверил, что мой hashmap действительно содержит пары ключей и значений. – activelearner

+0

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

+1

Я просто проверил это локально с помощью простого 2-х элементного HashMap, и он отлично работает для меня. –

0

Если у вас есть один HashMap это всего лишь несколько строк кода. Что-то вроде этого:

Map<String,String> myMap = new HashMap<>(); 

myMap.put("foo", "bar"); 
myMap.put("baz", "foobar"); 

StringBuilder builder = new StringBuilder(); 
for (Map.Entry<String, String> kvp : myMap.entrySet()) { 
    builder.append(kvp.getKey()); 
    builder.append(","); 
    builder.append(kvp.getValue()); 
    builder.append("\r\n"); 
} 

String content = builder.toString().trim(); 
System.out.println(content); 
//use your prefered method to write content to a file - for example Apache FileUtils.writeStringToFile(...) instead of syso.  

результат будет

foo,bar 
baz,foobar 
0

Мои Java немного ограничено, но не могли бы вы просто цикл над HashMap и добавления записи в строку?

// m = your HashMap 

StringBuilder builder = new StringBuilder(); 
for(Entry<String, String> e : m.entrySet()) 
{ 
    String key = e.getKey(); 
    String value = e.getValue(); 

    builder.append(key); 
    builder.append(','); 
    builder.append(value); 
    builder.append(System.getProperty("line.separator")); 
} 

string result = builder.toString(); 
2

Использование Джексона API , Карта или Список Карты могут быть записаны в CSV-файле. См. Полный пример here

/** 
* @param listOfMap 
* @param writer 
* @throws IOException 
*/ 
public static void csvWriter(List<HashMap<String, String>> listOfMap, Writer writer) throws IOException { 
    CsvSchema schema = null; 
    CsvSchema.Builder schemaBuilder = CsvSchema.builder(); 
    if (listOfMap != null && !listOfMap.isEmpty()) { 
     for (String col : listOfMap.get(0).keySet()) { 
      schemaBuilder.addColumn(col); 
     } 
     schema = schemaBuilder.build().withLineSeparator(System.lineSeparator()).withHeader(); 
    } 
    CsvMapper mapper = new CsvMapper(); 
    mapper.writer(schema).writeValues(writer).writeAll(listOfMap); 
    writer.flush(); 
} 

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

  • Нет связанных вопросов^_^