Мне нужно написать 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 стоит ";"
Я пытался использовать некоторые альтернативы, которые я нашел в руководстве пользователя, но ничего не получил.
В таком положении это выглядит сомнительно: csvPrinter.print("\r\n"); Кроме того, я не вижу, чтобы ответ вообще использовался. Я не знаю этого API, но это тоже выглядит сомнительно: csvPrinter.printRecord(values.get(key).toString() + ";"); Зачем вам явно добавлять разделители, когда вы указали формат?
Не смешивайте и не сочетайте print/println
и printRecord
. Кроме того, вы не передаете String в printRecord, вы передаете массив/Iterable, который обрабатывается с помощью toString()
@ g00se мое первое поле 4, до него нет другого; Я прошел ";" явно, потому что он не поместил его автоматически, так что это было точно. единственное, что он ставит ";" ненужный предшественник.
@kendavidson Я получаю это значение из массива json, поэтому я передал его таким образом. Вы рекомендуете передать этот jsonarray в список или массив, а затем вставить его в txt?
Поскольку сейчас вы создаете newFormat
(; разделитель, но нулевой разделитель записей), возможно, поэтому вы добавляете руководство \r\n
. Возможно, вы захотите использовать один из предварительно настроенных форматов CSVFormat.EXCEL.setDelimiter(';')
, а затем использовать только printRecord(keys)
.
Ключи @kendavidson имеют значения заголовков. Нужные мне значения находятся внутри ключа, поэтому мне нужно "values.get(key).toString()". Посмотрите, как это происходит, как вы рекомендовали: ibb.co/8bM3yFm Я пытался настроить его так, как я это сделал, и не смог, потому что «values.get(key).toString()» — это массив, он создает строку для каждого значения, см. ibb.co/2YKDps7 У вас есть идеи, как я могу правильно напечатать это?
Если вы удалите + ";"
в 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); }`
Это будет означать, что первое поле пусто