Разделитель печати CSVPrinter перед каждой строкой

Мне нужно написать csv с java, я использую org.apache.commons, но при печати файла разделитель ";" появляется перед каждой строкой.

Мой код

public static Object createCsvFile(JsonArray array, HttpServletResponse response) {
    var header = array.get(0).getAsJsonObject().keySet();

    try {
        StringWriter stringWriter = new StringWriter();
        CSVPrinter csvPrinter = new CSVPrinter(stringWriter, CSVFormat.newFormat(';'));
        csvPrinter.printRecord(header);
        for (int i = 0; i < array.size(); i++) {
            JsonObject values = array.get(i).getAsJsonObject();
            Set<String> keys = values.keySet();
            csvPrinter.print("\r\n");
            for (String key: keys) {
                csvPrinter.printRecord(values.get(key).toString() + ";");
            }
        }
        csvPrinter.close();
        return stringWriter.toString();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

Мой результат

;4;"11/10/2022 06:10";117;"ENTRADA POR PRODUCAO";422;"LINGUICA DE CARNE SUINA - AURORA - 5KG - CHURRASCO";"MI";"078911644790352718";"0422101011";"10/10/2022";1025;"116-BRASIL - MI";

Обратите внимание, что перед 4 стоит ";"

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

Это будет означать, что первое поле пусто

g00se 09.01.2023 19:47

В таком положении это выглядит сомнительно: csvPrinter.print("\r\n"); Кроме того, я не вижу, чтобы ответ вообще использовался. Я не знаю этого API, но это тоже выглядит сомнительно: csvPrinter.printRecord(values.get(key).toString() + ";"); Зачем вам явно добавлять разделители, когда вы указали формат?

g00se 09.01.2023 19:55

Не смешивайте и не сочетайте print/println и printRecord. Кроме того, вы не передаете String в printRecord, вы передаете массив/Iterable, который обрабатывается с помощью toString()

kendavidson 09.01.2023 20:13

@ g00se мое первое поле 4, до него нет другого; Я прошел ";" явно, потому что он не поместил его автоматически, так что это было точно. единственное, что он ставит ";" ненужный предшественник.

Mateus Bodanese 09.01.2023 21:08

@kendavidson Я получаю это значение из массива json, поэтому я передал его таким образом. Вы рекомендуете передать этот jsonarray в список или массив, а затем вставить его в txt?

Mateus Bodanese 09.01.2023 21:11

Поскольку сейчас вы создаете newFormat (; разделитель, но нулевой разделитель записей), возможно, поэтому вы добавляете руководство \r\n. Возможно, вы захотите использовать один из предварительно настроенных форматов CSVFormat.EXCEL.setDelimiter(';'), а затем использовать только printRecord(keys).

kendavidson 09.01.2023 21:27

Ключи @kendavidson имеют значения заголовков. Нужные мне значения находятся внутри ключа, поэтому мне нужно "values.get(key).toString()". Посмотрите, как это происходит, как вы рекомендовали: ibb.co/8bM3yFm Я пытался настроить его так, как я это сделал, и не смог, потому что «values.get(key).toString()» — это массив, он создает строку для каждого значения, см. ibb.co/2YKDps7 У вас есть идеи, как я могу правильно напечатать это?

Mateus Bodanese 10.01.2023 14:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы удалите + ";" в csvPrinter.printRecord(values.get(key).toString() + ";");, вы увидите, что это ваши CSVPrinter добавляют их перед каждой строкой.

Вы должны позволить своему CSVPrinter обрабатывать разделитель.

Просто чтобы вдохновить вас, попробуйте следующее:

public static Object createCsvFileBis(JsonArray array, HttpServletResponse response) {
    var header = array.get(0).getAsJsonObject().keySet();

    try (
            StringWriter stringWriter = new StringWriter();
            CSVPrinter csvPrinter = new CSVPrinter(stringWriter, CSVFormat.newFormat(';'))
    ) {
        csvPrinter.printRecord(header);
        for (int i = 0; i < array.size(); i++) {
            JsonObject values = array.get(i).getAsJsonObject();
            Set<String> keys = values.keySet();
            csvPrinter.printRecord("\n");
            List<String> row = new ArrayList<>();
            for (String key : keys) {
                row.add(values.get(key).toString());
            }
            csvPrinter.printRecord(row);
        }
        csvPrinter.flush();
        return stringWriter.toString();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

Спасибо за подсказку, следуйте вашему примеру и я понял, я просто изменил способ создания шапки, сделав это следующим образом. ` for (String head: header) { csvPrinter.printRecord(head); }`

Mateus Bodanese 12.01.2023 13:15

Другие вопросы по теме