- How to read and write CSV files using core Java
- You might also like.
- Rukovodstvo
- статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
- Чтение и запись CSV на Java
- Введение Это первая статья из короткой серии, посвященной библиотекам для чтения и записи CSV на Java [/ библиотеки-для-чтения-и-записи-csvs-in-java]. Чтение и запись CSV в Core Java Благодаря популярности и широкому использованию CSV в качестве формата для передачи данных существует множество библиотек синтаксического анализатора, которые можно использовать вместе с Java. Сторонние парсеры определяют общие форматы и могут работать с различными разделителями, обрабатывать специальные символы, а иногда даже читать не-b
- Вступление
- Чтение и запись CSV в Core Java
- Написание CSV на Core Java
- Заключение
How to read and write CSV files using core Java
In earlier articles, I explained how to read and writing CSV files using OpenCSV as well as Apache Commons CSV library.
This article is the last one in our short series to learn about 3rd-party libraries and core Java APIs for efficiently reading and writing CSV files.
A CSV file is a plain-text file that stores data in a tabular format, where columns are separated by a delimiter (usually a comma , or a tab). These files are a common choice for importing and exporting data between servers and applications.
In this article, you’ll learn how to read and write CSV files using core Java without using any 3rd-party library.
Two important problems that we may face while reading and parsing CSV files:
- The field value contains the delimiter. For example, a comma is used as a separator, and the field value containing commas: 1, «Greta, Jones», UK
- The field value contains double-quotes, and the double-quotes are used to wrap field values. In such a case, according to RFC 4180, a double-quote that appears inside the field value must be properly-escaped by preceding it with another double-quote: «1», «Greta»»Jones», «UK»
If your CSV file contains any of the above things, you should use a 3rd-party library like OpenCSV for reading the CSV file.
Third-party libraries are definitely a better choice for handling different CSV formats, delimiters, and special characters.
However, not all CSV files have such problems. For simple CSV files (without double-quotes and delimiters in field values), core Java is sufficient.
Here is how our sample CSV file looks:
1,John Deo,john@example.com,US 2,Alex Jones,alex@example.com,DE 3,Jovan Lee,jovan@example.com,FR 4,Greg Hover,greg@example.com,US 4,Emma Watson,emma@example.com,CA
The Scanner class in Java breaks its input into tokens using a delimiter pattern, which by default matches whitespace. The resulting tokens may then be converted into values of different types using the various next methods.
try // create scanner instance Scanner scanner = new Scanner(Paths.get("users.csv").toFile()); // set comma as delimiter scanner.useDelimiter(","); // read all fields while (scanner.hasNext()) System.out.print(scanner.next() + " "); > //close the scanner scanner.close(); > catch (FileNotFoundException ex) ex.printStackTrace(); >
1 John Deo john@example.com US 2 Alex Jones alex@example.com DE 3 Jovan Lee jovan@example.com FR 4 Greg Hover greg@example.com US 4 Emma Watson emma@example.com CA
Another way of reading and parsing a CSV file is by using a combination of the BufferedReader class and the String.split() method:
try // CSV file delimiter String DELIMITER = ","; // create a reader BufferedReader br = Files.newBufferedReader(Paths.get("users.csv")); // read the file line by line String line; while ((line = br.readLine()) != null) // convert line into tokens String[] tokens = line.split(DELIMITER); // TODO: do something here with the data // print all tokens for (String token : tokens) System.out.println(token); > > // close the reader br.close(); > catch (IOException ex) ex.printStackTrace(); >
- Open the CSV file for reading by using the Files.newBufferedReader() method.
- Create an instance of BufferedReader to read the file line by line until the end of file (EOF) is reached.
- Use the String.split() method to convert each line into multiple tokens by using the comma ( , ) as a delimiter.
- The tokens array should contain a list of fields found in each the CSV file row. You should use this array to process the CSV record; like saving it to a database or storing in a Java collection for later use.
Writing data to a CSV file is like writing to any other text file in Java. The simplest way is to use the FileWriter class. This is a convenience class for writing streams of characters. The following example demonstrates how to write a List of objects to a CSV file using the FileWriter in Java:
try // create a list of objects ListListString>> records = Arrays.asList( Arrays.asList("1", "John Lee", "US"), Arrays.asList("2", "Jovan Roover", "DE"), Arrays.asList("3", "Emma Watson", "UK") ); // create a writer BufferedWriter writer = Files.newBufferedWriter(Paths.get("users-with-header.csv")); // write header record writer.write("ID,Name,Country"); writer.newLine(); // write all records for (ListString> record : records) writer.write(String.join(",", record)); writer.newLine(); > //close the writer writer.close(); > catch (IOException ex) ex.printStackTrace(); >
ID,Name,Country 1,John Lee,US 2,Jovan Roover,DE 3,Emma Watson,UK
In this tutorial, we learned how to read and write CSV files using core Java without any 3rd-party library. You can use either the Scanner class or BufferedReader to read and parse a CSV file line by line. For writing to CSV files, you should use the FileWriter class. This solution is intended for reading and writing simple CSV files. For complex CSV files with multiple delimiters, double-quotes, and special characters, you should use 3rd-party libraries.
✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.
You might also like.
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 для дальнейшего использования. Например, если вы записываете большой объем данных в базу данных, нарушений ограничений (например, нарушений первичного ключа), вызванных человеческими ошибками при создании 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