Java - записать хэш-карту в файл csv

У меня есть хэш-карта со строковым ключом и строковым значением. Он содержит большое количество ключей и соответствующих им значений.

Например:

key | value
abc | aabbcc
def | ddeeff

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

abc,aabbcc
def,ddeeff

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


person activelearner    schedule 01.07.2015    source источник
comment
Не могли бы вы опубликовать то, что вы пробовали до сих пор (в коде)?   -  person Sam Estep    schedule 02.07.2015
comment
Где твоя проблема? Создание контента, что является 1o1 итерации, или запись в файл — что является 1o1 FileSystemAccess?   -  person dognose    schedule 02.07.2015


Ответы (5)


Поскольку ваш вопрос спрашивает, как это сделать с помощью Super CSV, я подумал, что вмешаюсь (как сопровождающий проект).

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

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

@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
person James Bassett    schedule 02.07.2015
comment
Не могли бы вы сказать мне, какие библиотеки мне нужно импортировать для этого? или Мне нужно написать какой-либо другой метод для запуска этого или я могу использовать его как есть? - person RV_Dev; 27.02.2017

Используя API Джексона, карту или список карт можно записать в файл CSV. См. полный пример здесь.

 /**
 * @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();
}
person Ajay Kumar    schedule 03.08.2016

Что-то вроде этого должно помочь:

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);
}
person Sean Bright    schedule 01.07.2015
comment
Я получаю пустой файл после успешной компиляции и выполнения этого кода? Я проверил, что моя хэш-карта содержит пары ключей и значений. - person activelearner; 02.07.2015
comment
Я не понимаю, как это возможно, если вы не получаете исключение. Если вы обновите свой вопрос кодом, который вы сейчас используете, я могу взглянуть. - person Sean Bright; 02.07.2015
comment
Я только что протестировал это локально с помощью простого двухэлементного HashMap, и он отлично работает для меня. - person Sean Bright; 02.07.2015
comment
Я получаю пустые файлы. - person RV_Dev; 15.03.2017
comment
работает как шарм, спасибо и ура! Использовал его для создания csv из около 500 записей, проанализированных с динамической страницы. - person Sheikh Faisal Miskhat; 03.06.2019

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

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
person dognose    schedule 01.07.2015
comment
Этот ответ не то, что спрашивают. ТС попросил написать в csv - person Kees de Vriesch; 08.11.2020

Моя 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();
person James    schedule 01.07.2015