Я пытаюсь удалить первую строку из CSV-файла после его прочтения. Код работает правильно, но добавляет "" к моим данным при перезаписи. для примера:
после записи в файл 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. Просто прочитайте файл построчно с помощью обычного буферизованного ридера и не записывайте первую строку.
@GhostCat Любой пример, пожалуйста?
Пожалуйста, отойдите назад. Я действительно не понимаю, чего именно вы хотите добиться. Я имею в виду: какова реальная цель вашего кода? Что именно происходит и ожидается? Какие данные должны быть в файле и «в памяти» после запуска метода?
У меня есть файл пациента.csv, и я использую этот файл как @DataProvider. Сначала я читаю первую строку (например: 1, имя, фамилия) из CSV-файла, а после проверки удаляю использованную строку из CSV-файла.




это способ преобразовать список в одиночную строку, разделенную запятыми.
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 смотрите мой обновленный ответ .. Если у вас есть List<String[]>, он преобразуется в строку, разделенную запятой без "". выполните вышеуказанную операцию в вашем новом списке.
это так не сработает. Поскольку я использую write.writeAll(); writeAll (java.util.List<java.lang.String[]>) в CSVWriter нельзя применить к (java.lang.String)
@SanjX, какой у тебя титул. Прочитай заново. Я ответил на него в соответствии с вашим заголовком.
тогда как этот человек все правильно понял :) stackoverflow.com/a/55222066/7758011 ничего страшного спасибо!
Ваш модуль записи 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);
пожалуйста, добавьте имя библиотеки CSV Writer.