Java load csv file

Содержание
  1. Reading CSV file in Java
  2. 2. Example CSV file
  3. 2. Read CSV file line by line using BufferedReader
  4. 3. Using Scanner to read CSV file
  5. 4. Using JDK 8 Files.readAllLines(. ) method
  6. 5. Using OpenCSV library
  7. 6. Reading CSV file into Java model
  8. 7. Conclusion
  9. Rukovodstvo
  10. статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
  11. Чтение и запись CSV на Java
  12. Введение Это первая статья из короткой серии, посвященной библиотекам для чтения и записи CSV на Java [/ библиотеки-для-чтения-и-записи-csvs-in-java]. Чтение и запись CSV в Core Java Благодаря популярности и широкому использованию CSV в качестве формата для передачи данных существует множество библиотек синтаксического анализатора, которые можно использовать вместе с Java. Сторонние парсеры определяют общие форматы и могут работать с различными разделителями, обрабатывать специальные символы, а иногда даже читать не-b
  13. Вступление
  14. Чтение и запись CSV в Core Java
  15. Написание CSV на Core Java
  16. Заключение

Reading CSV file in Java

The CSV (Comma Separated Values) is a text-based format that separates fields with comma delimiter , . Line in CSV files represents one record that usually ends with a line break. In this article, we are going to present several ways to read CSV file using plain Java, OpenCSV library, and dedicated solution based on annotations and reflection.

2. Example CSV file

CSV file used in this tutorial contains a list of usernames with additional information:

Username,Identifier,First name,Last name booker12,9012,Rachel,Booker grey07,2070,Laura,Grey johnson81,4081,Craig,Johnson jenkins46,9346,Mary,Jenkins smith79,5079,Jamie,Smith 

This is the CSV file viewed as spread sheet:

Username Identifier First name Last name
booker12 9012 Rachel Booker
grey07 2070 Laura Grey
johnson81 4081 Craig Johnson
jenkins46 9346 Mary Jenkins
smith79 5079 Jamie Smith

2. Read CSV file line by line using BufferedReader

Actually you can use any method available in plain Java to read a file line by line and then split fields using String.split(. ) method to parse it.

package com.frontbackend.java.io.csv; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ReadCSVUsingBufferedReader < private final static String COMMA_DELIMITER = ","; public static void main(String[] args) throws IOException < try (BufferedReader br = new BufferedReader(new FileReader("/tmp/username.csv"))) < List> result = new ArrayList<>(); String line; while ((line = br.readLine()) != null) < String[] values = line.split(COMMA_DELIMITER); result.add(Arrays.asList(values)); >System.out.println(result); > > > 

In this example, we used BufferedReader that allows us to read a file line by line and also supports buffering. In the first step we read a line from the CSV file, and then we split it into tokens using String.split(«,») method. The result object contains a list of lines with a list of values.

[[Username, Identifier, First name, Last name], [booker12, 9012, Rachel, Booker], [grey07, 2070, Laura, Grey], [johnson81, 4081, Craig, Johnson], [jenkins46, 9346, Mary, Jenkins], [smith79, 5079, Jamie, Smith]] 

3. Using Scanner to read CSV file

The Scanner class can parse primitive types and strings using regular expressions. In the following example we use it to retrieve lines of the CSV file and parse it using comma delimiter:

package com.frontbackend.java.io.csv; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class ReadCSVUsingScanner < private final static String COMMA_DELIMITER = ","; public static void main(String[] args) throws IOException < List> result = new ArrayList<>(); try (Scanner scanner = new Scanner(new File("/tmp/username.csv"))) < while (scanner.hasNextLine()) < String line = scanner.nextLine(); Listfields = new ArrayList<>(); try (Scanner rowScanner = new Scanner(line)) < rowScanner.useDelimiter(COMMA_DELIMITER); while (rowScanner.hasNext()) < fields.add(rowScanner.next()); >> result.add(fields); > > System.out.println(result); > > 

As you can see this is a little bit complex way to parse a CSV file.

Читайте также:  Найти сумму чисел массива php

4. Using JDK 8 Files.readAllLines(. ) method

Let’s check solution available in JDK 8 using Files.readAllLines(. ) method.

package com.frontbackend.java.io.csv; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class ReadCSVUsingFiles < private final static String COMMA_DELIMITER = ","; public static void main(String[] args) throws IOException < List> result = Files.readAllLines(Paths.get("/tmp/username.csv")) .stream() .map(line -> Arrays.asList(line.split(COMMA_DELIMITER))) .collect(Collectors.toList()); System.out.println(result); > > 

In this example, we make use of the Files class available in java.nio package and Java streams to map lines into splitted fields.

5. Using OpenCSV library

The OpenCSV is a library dedicated to working with CSV files. We can use it to read the CSV and parse it into Java structure:

package com.frontbackend.java.io.csv; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.opencsv.CSVReader; public class ReadCSVUsingOpenCSV < public static void main(String[] args) throws IOException < List> result = new ArrayList<>(); try (CSVReader csvReader = new CSVReader(new FileReader("/tmp/username.csv"))) < String[] values; while ((values = csvReader.readNext()) != null) < result.add(Arrays.asList(values)); >> System.out.println(result); > > 

In this example, we used the readNext() method in CSVReader to read the records from the file.

6. Reading CSV file into Java model

If we want to parse CSV files directly into Java POJO classes with fields that represent columns, we must implement a dedicated parser.

First, let’s start with the dedicated annotation called CSVField that will be used to mark fields in POJO object:

package com.frontbackend.java.io.csv.model; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface CSVField

Columns from our CSV file will be represented by CSVColumn enum object:

package com.frontbackend.java.io.csv.model; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor public enum CSVColumn

In POJO class we need to set annotations for all the fields that have a representation in the CSV file:

package com.frontbackend.java.io.csv.model; import lombok.Getter; import lombok.Setter; import lombok.ToString; @ToString @Getter @Setter public class User

Magic happen in CSVAbstractParser class:

  • 1) first we parse CSV file using Files.readAllLines(. ) method,
  • 2) we assume that first row in CSV file will be the header,
  • 3) we search for the headers and fields that represent them in POJO classes,
  • 4) we iterate over list of rows and set values for all fields annotated with CSVField ,
  • 5) parser returns a list of POJO objects.
package com.frontbackend.java.io.csv.model; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; public abstract class CSVAbstractParser  < private final static int FIRST_LINE_INDEX = 0; private final static String COMMA_DELIMITER = ","; public Listparse(Path path, Class cls) throws IOException < List> lines = Files.readAllLines(path) .stream() .map(line -> Arrays.asList(line.split(COMMA_DELIMITER))) .collect(Collectors.toList()); if (lines.size() > 0) < Mapheader = getHeaders(cls, lines.get(FIRST_LINE_INDEX)); return lines.subList(FIRST_LINE_INDEX + 1, lines.size() - 1) .stream() .map(line -> getT(cls, header, line)) .collect(Collectors.toList()); > return Collections.emptyList(); > private T getT(Class cls, Map header, List line) < try < T obj = cls.getDeclaredConstructor() .newInstance(); for (int index = 0; index < line.size(); index++) < Field field = header.get(index); String fieldName = field.getName(); Optionalsetter = getSetterMethod(obj, fieldName); if (setter.isPresent()) < Method setMethod = setter.get(); setMethod.invoke(obj, line.get(index)); >> return obj; > catch (Exception e) < e.printStackTrace(); >return null; > private Optional getSetterMethod(T obj, String fieldName) < return Arrays.stream(obj.getClass() .getDeclaredMethods()) .filter(method ->method.getName() .equals("set" + fieldName.substring(0, 1) .toUpperCase() + fieldName.substring(1))) .findFirst(); > private Map getHeaders(Class cls, List firstLine) < final Mapmap = new HashMap<>(); Stream.of(cls.getDeclaredFields()) .filter(field -> field.getAnnotation(CSVField.class) != null) .forEach(field -> < CSVField csvField = field.getAnnotation(CSVField.class); String columnName = csvField.column() .getColumn() .trim(); int columnIndex = firstLine.indexOf(columnName); map.put(columnIndex, field); >); return map; > > 

The CSV parser dedicated for User entity:

Читайте также:  Красивая форма комментариев css

package com.frontbackend.java.io.csv.model; public class CSVUserParser extends CSVAbstractParser

To parse CSV file we need to create an instance of CSVUserParser and run parse(. ) method with the path to the CSV file, and class that will be our row representation:

package com.frontbackend.java.io.csv.model; import java.io.IOException; import java.nio.file.Paths; import java.util.List; public class ReadCSVIntoModel < public static void main(String[] args) throws IOException < CSVUserParser csvUserParser = new CSVUserParser(); Listusers = csvUserParser.parse(Paths.get("/tmp/username.csv"), User.class); System.out.println(users); > > 
[User(username=booker12, firstName=Rachel, lastName=Booker), User(username=grey07, firstName=Laura, lastName=Grey), User(username=johnson81, firstName=Craig, lastName=Johnson), User(username=jenkins46, firstName=Mary, lastName=Jenkins)] 

7. Conclusion

In this article, we showcased several ways to read and parse the CSV file in Java. We presented a plain Java solution and an external library solution using OpenCSV. In case you need to convert CSV file to POJO objects you could use our dedicated solution described in point 6.

As usual, the code used in this tutorial is available under GitHub.

Источник

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Чтение и запись CSV на Java

Введение Это первая статья из короткой серии, посвященной библиотекам для чтения и записи CSV на Java [/ библиотеки-для-чтения-и-записи-csvs-in-java]. Чтение и запись CSV в Core Java Благодаря популярности и широкому использованию CSV в качестве формата для передачи данных существует множество библиотек синтаксического анализатора, которые можно использовать вместе с Java. Сторонние парсеры определяют общие форматы и могут работать с различными разделителями, обрабатывать специальные символы, а иногда даже читать не-b

Вступление

Это первая статья из короткой серии, посвященной библиотекам для чтения и записи CSV на Java .

Чтение и запись CSV в Core Java

Благодаря популярности и широкому распространению CSV в качестве формата для передачи данных существует множество библиотек синтаксического анализатора, которые можно использовать вместе с Java.

Сторонние парсеры определяют общие форматы и могут работать с различными разделителями, обрабатывать специальные символы и иногда даже читать недвоичные данные. Однако не всем программам требуются все эти функции, поэтому по-прежнему важно иметь возможность обрабатывать файлы CSV с помощью ядра Java без использования каких-либо дополнительных библиотек.

Простая комбинация FileReader , BufferedReader и String.split() может облегчить чтение данных из CSV. Давайте рассмотрим шаги, чтобы открыть базовый файл CSV и проанализировать содержащиеся в нем данные:

  • Используйте FileReader чтобы открыть файл CSV
  • Создайте BufferedReader и прочитайте файл построчно, пока не будет достигнут символ «Конец файла» ( EOF).
  • Используйте метод String.split() чтобы определить разделитель запятой и разделить строку на поля.
 BufferedReader csvReader = new BufferedReader(new FileReader(pathToCsv)); while ((row = csvReader.readLine()) != null) < String[] data = row.split(","); // do something with the data >csvReader.close(); 

data будет содержать список полей в каждой строке файла, найденного в расположении файла pathToCsv Если в CSV-файле есть разделитель, отличный от запятой, его можно указать в методе split Например, еще одним распространенным разделителем является вкладка для файлов TSV (Tab-Separated-Value).

Читайте также:  Java get current method name

Данные могут быть переданы в отдельный метод для обработки или записи в базу данных из цикла или сохранены в коллекции Java для дальнейшего использования. Например, если вы записываете большой объем данных в базу данных, нарушений ограничений (например, нарушений первичного ключа), вызванных человеческими ошибками при создании CSV, можно избежать с помощью хэш-карты. Если в CSV есть повторяющаяся запись, хэш-карта сохранит самое последнее «прочитанное» и перезапишет предыдущую запись.

Поскольку вы пишете синтаксический анализатор с нуля, вам необходимо самостоятельно позаботиться о простой обработке ошибок. Например, если вы не уверены, существует ли файл, всегда безопаснее заключить операцию чтения в блок try/catch или добавить логику для определения существования файла перед обработкой.

Чтобы проверить, существует ли файл, в наш код можно внести следующие изменения:

 File csvFile = new File(pathToCsv); if (csvFile.isFile()) < // create BufferedReader and read data from csv >

С некоторой простой обработкой ошибок и строгими требованиями к формату CSV создание простого анализатора самостоятельно с использованием основных компонентов Java — задача, которую может взять на себя большинство программистов.

Написание CSV на Core Java

Большинство сторонних парсеров также поддерживают запись в файлы CSV. Однако есть простой способ записи в файлы CSV, как и в файлы любого другого типа, без использования каких-либо библиотек.

Самый простой способ — использовать FileWriter и обрабатывать файл CSV как любой другой текстовый файл. В нашем примере данные хранятся в некоторых List , которые мы просто перебираем и добавляем в средство записи:

 // Our example data List> rows = Arrays.asList( Arrays.asList("Jean", "author", "Java"), Arrays.asList("David", "editor", "Python"), Arrays.asList("Scott", "editor", "Node.js") ); FileWriter csvWriter = new FileWriter("new.csv"); csvWriter.append("Name"); csvWriter.append(","); csvWriter.append("Role"); csvWriter.append(","); csvWriter.append("Topic"); csvWriter.append("\n"); for (List rowData : rows) < csvWriter.append(String.join(",", rowData)); csvWriter.append("\n"); >csvWriter.flush(); csvWriter.close(); 

При использовании FileWriter всегда убеждайтесь, что вы сбрасываете и закрываете поток. Это улучшает производительность операции ввода-вывода и указывает на то, что в выходной поток больше нет данных для записи.

Заключение

Существует несколько способов чтения и записи файлов CSV в Java, самый простой из которых — использовать компоненты Core Java. Хотя это также делает вас более уязвимым для ошибок и будет менее надежным, чем проверенное стороннее решение.

Если вам интересно узнать о других способах чтения и записи CSV на Java, обязательно ознакомьтесь с другими нашими статьями:

Licensed under CC BY-NC-SA 4.0

Источник

Оцените статью