Как преобразовать List<String[]> в строку, разделенную запятыми, без " " в Java

Я пытаюсь удалить первую строку из CSV-файла после его прочтения. Код работает правильно, но добавляет "" к моим данным при перезаписи. для примера:

  • перед записью в файл csv: 100,COMRADE,CAMPBELL
  • после записи в файл csv: "100","COMRADE","CAMPBELL"

    Вот код.

================================================== ======================

public void deleteLineFromCsv() throws IOException {
        List<PatientsTabData> list = new ArrayList<>();
        BufferedReader reader = new BufferedReader(new FileReader(new File("src/main/resources/patients.csv")));
        String line = reader.readLine();
        while(line != null) {
            String[] split = line.split(",");
            list.add(new PatientsTabData().patientId(Integer.parseInt(split[0])).patName(split[1]).patLastName(split[2]));
            line = reader.readLine();
        }
        list.remove(0);
        CSVWriter writer = new CSVWriter(new FileWriter(new File("src/main/resources/patients.csv")));
        List<String[]> newlist = list.stream().map(item -> new String[]
                {String.valueOf(item.getPatientId()), item.getPatName(), item.getPatLastName()})
                .collect(Collectors.toList());
        writer.writeAll(newlist);
        writer.close();
    }

Library:

        <dependency>
            <groupId>net.sf.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>2.3</version>
        </dependency>

пожалуйста, добавьте имя библиотеки CSV Writer.

Umar Hussain 18.03.2019 13:19

добавил к вопросу

SanjX 18.03.2019 13:20

Если ваше требование действительно таково: удаление первой строки из файла, то я бы не стал использовать здесь программу чтения/записи csv. Просто прочитайте файл построчно с помощью обычного буферизованного ридера и не записывайте первую строку.

GhostCat 18.03.2019 13:54

@GhostCat Любой пример, пожалуйста?

SanjX 18.03.2019 13:56

Пожалуйста, отойдите назад. Я действительно не понимаю, чего именно вы хотите добиться. Я имею в виду: какова реальная цель вашего кода? Что именно происходит и ожидается? Какие данные должны быть в файле и «в памяти» после запуска метода?

GhostCat 18.03.2019 13:57

У меня есть файл пациента.csv, и я использую этот файл как @DataProvider. Сначала я читаю первую строку (например: 1, имя, фамилия) из CSV-файла, а после проверки удаляю использованную строку из CSV-файла.

SanjX 18.03.2019 14:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
524
3

Ответы 3

это способ преобразовать список в одиночную строку, разделенную запятыми.

List<String[]> oldList= . . . ;
String requiredString = oldList
.stream()
    .map(Arrays::asList)
    .flatMap(Collection::stream)
    .collect(Collectors.joining(","));

как насчет этой части (item -> new String[] {String.valueOf(item.getPatientId()), item.getPatName(), item.getPatLastName()})?

SanjX 18.03.2019 13:17

@SanjX смотрите мой обновленный ответ .. Если у вас есть List<String[]>, он преобразуется в строку, разделенную запятой без "". выполните вышеуказанную операцию в вашем новом списке.

Khalid Shah 18.03.2019 13:27

это так не сработает. Поскольку я использую write.writeAll(); writeAll (java.util.List<java.lang.String[]>) в CSVWriter нельзя применить к (java.lang.String)

SanjX 18.03.2019 13:51

@SanjX, какой у тебя титул. Прочитай заново. Я ответил на него в соответствии с вашим заголовком.

Khalid Shah 18.03.2019 14:11

тогда как этот человек все правильно понял :) stackoverflow.com/a/55222066/7758011 ничего страшного спасибо!

SanjX 18.03.2019 14:16

Ваш модуль записи CSV записывает каждый элемент в виде строки в CSV-файл. Это может быть задумано в библиотеке, так как она сохранит любую запятую в ваших данных в строке, а позже не добавит дополнительный столбец, если в ваших данных также есть запятая.

"name","class","house, street, city","value"

См. документацию вашей библиотеки и проверьте, предоставляет ли она возможность не рассматривать каждый элемент как строку.

Но я считаю, что нужно держать строки в кавычках, чтобы избежать искажения данных во время чтения.

Вы можете использовать другой конструктор при создании вашего писателя. Изменять

CSVWriter writer = new CSVWriter(new FileWriter(new File("src/main/resources/patients.csv")));

к

CSVWriter writer = new CSVWriter(new FileWriter(new File("src/main/resources/patients.csv")),',',CSVWriter.NO_QUOTE_CHARACTER);

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