Правильно записывать элементы карты в CSV в упрощенном виде в Java 8 - PullRequest
0 голосов
/ 08 мая 2020

У меня есть карта стран со следующим дизайном:

England=24
Spain=21
Italy=10
etc

Затем у меня есть другая карта городов со следующим дизайном:

London=10
Manchester=5
Madrid=7
Barcelona=4
Roma=3
etc

В настоящее время я печатаю эти результаты на экране:

    System.out.println("\nCountries:");
    Map<String, Long> countryMap = countTotalResults(orderDataList, OrderData::getCountry);
    writeResultInCsv(countryMap);
    countryMap.entrySet().stream().forEach(System.out::println);

System.out.println("\nCities:\n");
    Map<String, Long> citiesMap = countTotalResults(orderDataList, OrderData::getCity);
    writeResultInCsv(citiesMap);
    citiesMap.entrySet().stream().forEach(System.out::println);

Я хочу записать каждую строку моих двух карт в один и тот же файл CSV. У меня есть следующий код:

public void writeResultInCsv(Map<String, Long> resultMap) throws Exception {
    File csvOutputFile = new File(RUTA_FICHERO_RESULTADO);
    try (PrintWriter pw = new PrintWriter(csvOutputFile)) {
        resultMap.entrySet().stream()
                .map(this::convertToCSV)
                .forEach(pw::println);
    }
}

public String convertToCSV(String[] data) {
    return Stream.of(data)
            .map(this::escapeSpecialCharacters)
            .collect(Collectors.joining("="));
}

public String escapeSpecialCharacters(String data) {
    String escapedData = data.replaceAll("\\R", " ");
    if (data.contains(",") || data.contains("\"") || data.contains("'")) {
        data = data.replace("\"", "\"\"");
        escapedData = "\"" + data + "\"";
    }
    return escapedData;
}

Но я получаю ошибку компиляции в методе writeResultInCsv в следующей строке: .map (this :: convertToCSV)

Это ошибка компиляции, которую я получаю : reason: Несовместимые типы: Запись не может быть преобразована в String []

Как я могу в упрощенном виде указать следующий результат в CSV-файле в Java 8? Вот результат и дизайн, которые я хочу, чтобы мой CSV-файл имел:

Countries:
England=24
Spain=21
Italy=10
etc

Cities:
London=10
Manchester=5
Madrid=7
Barcelona=4
Roma=3
etc

1 Ответ

1 голос
/ 08 мая 2020

Ваш resultMap.entrySet() - Set<Map.Entry<String, Long>>. Затем вы превращаете его в Stream<Map.Entry<String, Long>>, а затем запускаете на нем .map. Таким образом, предоставляемый вами картограф должен отображать объекты типа Map.Entry<String, Long> на все, что вам нравится. но вы передаете ему метод convertToCSV, который отображает строковые массивы.

Ваш код пытается присоединиться через запятую (Collectors.joining(",")), но желаемый результат содержит ноль запятых.

Похоже, происходит одно из двух:

  1. вы скопировали / вставили этот код откуда-то, или он был предоставлен вам, и вы не знаете, что он делает. Я бы посоветовал разорвать этот код на части: возьмите каждый отдельный кусок, поэкспериментируйте с ним, пока не поймете его, затем снова соберите его, и теперь вы знаете, на что смотрите. В этот момент вы бы знали, что наличие Collectors.joining(",") в этом не имеет никакого смысла и что вы пытаетесь сопоставить запись String, Long с помощью функции сопоставления, которая сопоставляет строковые массивы, что, очевидно, не работает.

  2. Вы бы знали все это, но вы даже не удосужились взглянуть на свой код. Это кажется немного удивительным, поэтому я не думаю, что дело в этом. Но если это так - код, который у вас есть, настолько не связан с работой, которую вы хотите выполнить, что вы можете полностью удалить свой код и задать этот вопрос следующим образом: «У меня есть это. Я хочу это. Как мне это сделать? "

NB: текстовый файл со списком key=value пар обычно не называется файлом CSV.

...