- Java Scanner useDelimiter с примерами
- 2. Введение в java.util.Scanner
- 3. Используйте настраиваемые разделители
- 4. Вывод
- Tech Tutorials
- Saturday, June 17, 2023
- Reading Delimited File in Java Using Scanner
- Java program to read CSV file using Scanner
- Java program to read pipe (|) delimited file using Scanner
- How do I read a delimited file in Java?
- How do I read a csv file in Java?
- What does a delimiter do in Java?
- How do you identify a delimiter in a text file?
- What is the delimiter in a csv file?
- What is a delimiter in SAS?
- What is Opencsv?
- Can Java read Excel files?
- How do you read a comma separated integer in Java?
- What is use delimiter?
- Is object class final in Java?
Java Scanner useDelimiter с примерами
В этом руководстве мы увидим, как использовать метод useDelimiter класса Scanner .
2. Введение в java.util.Scanner
Scanner API предоставляет простой текстовый сканер.
По умолчанию Scanner разбивает входные данные на токены, используя пробелы в качестве разделителей. Напишем функцию, которая будет:
Давайте посмотрим на базовую реализацию:
public static ListString> baseScanner(String input) try (Scanner scan = new Scanner(input)) ListString> result = new ArrayListString>(); scan.forEachRemaining(result::add); return result; > >
Обратите внимание, что в этом фрагменте кода мы использовали попытку с ресурсами для создания нашего сканера . Это возможно, потому что класс Scanner реализует интерфейс AutoCloseable . Этот блок отвечает за автоматическое закрытие ресурса Scanner. До Java 7 мы не могли использовать try-with-resources , и поэтому нам приходилось обрабатывать это вручную.
Мы также можем заметить, что для повторения элементов Scanner мы использовали метод forEachRemaining . Этот метод был представлен в Java 8. Scanner реализует Iterator , и нам пришлось бы воспользоваться этим для перебора элементов, если бы мы использовали более старую версию Java.
Как мы уже говорили, Scanner по умолчанию будет использовать пробелы для анализа ввода. Например, вызов нашего метода baseScanner со следующим вводом: «Добро пожаловать в ForEach» должен вернуть список, содержащий следующие упорядоченные элементы: «Добро пожаловать», «в», «ForEach».
Давайте напишем тест, чтобы проверить, что наш метод ведет себя так, как ожидалось:
@Test void whenBaseScanner_ThenWhitespacesAreUsedAsDelimiters() assertEquals(List.of("Welcome", "to", "ForEach"), baseScanner("Welcome to ForEach")); >
3. Используйте настраиваемые разделители
Теперь давайте настроим наш сканер на использование пользовательского разделителя. Мы передадим строку , которая будет использоваться сканером для прерывания ввода.
Давайте посмотрим, как мы можем это сделать:
public static ListString> scannerWithDelimiter(String input, String delimiter) try (Scanner scan = new Scanner(input)) scan.useDelimiter(delimiter); ListString> result = new ArrayListString>(); scan.forEachRemaining(result::add); return result; > >
Прокомментируем пару примеров:
- мы можем использовать одиночный символ в качестве разделителя: при необходимости этот символ должен быть экранирован . Например, если мы хотим имитировать базовое поведение и использовать пробелы в качестве разделителей, мы будем использовать « \ s». «
- мы можем использовать любое слово/фразу в качестве разделителя
- мы можем использовать несколько возможных символов в качестве разделителей: для этого мы должны разделить их знаком |. Например, если мы хотим разделить ввод между каждым пробелом и каждым разрывом строки, мы будем использовать следующий разделитель: «\n| \ s»
- в двух словах, мы можем использовать любое регулярное выражение в качестве разделителя: например, «a+» является допустимым разделителем
Давайте посмотрим, как мы будем тестировать первый случай:
@Test void givenSimpleCharacterDelimiter_whenScannerWithDelimiter_ThenInputIsCorrectlyParsed() assertEquals(List.of("Welcome", "to", "ForEach"), scannerWithDelimiter("Welcome to ForEach", "\\s")); >
На самом деле, в сцене метод useDelimiter преобразует свои входные данные в регулярное выражение , инкапсулированное в объекте Pattern . В качестве альтернативы мы могли бы сами позаботиться о создании экземпляра Pattern . Для этого нам нужно будет использовать переопределяющий useDelimiter(Pattern pattern) , как показано здесь:
public static ListString> scannerWithDelimiterUsingPattern(String input, Pattern delimiter) try (Scanner scan = new Scanner(input)) scan.useDelimiter(delimiter); ListString> result = new ArrayListString>(); scan.forEachRemaining(result::add); return result; > >
Чтобы создать экземпляр Pattern , мы можем использовать метод compile , как в следующем тесте:
@Test void givenStringDelimiter_whenScannerWithDelimiterUsingPattern_ThenInputIsCorrectlyParsed() assertEquals(List.of("Welcome", "to", "ForEach"), DelimiterDemo.scannerWithDelimiterUsingPattern("Welcome to ForEach", Pattern.compile("\\s"))); >
4. Вывод
В этой статье мы продемонстрировали несколько примеров шаблонов, которые можно использовать для вызова функции useDelimiter . Мы заметили, что по умолчанию Scanner использует разделители-пробелы, и указали, что там можно использовать любые регулярные выражения.
Как всегда, полный код доступен на GitHub .
Tech Tutorials
Tutorials and posts about Java, Spring, Hadoop and many more. Java code examples and interview questions. Spring code examples.
Saturday, June 17, 2023
Reading Delimited File in Java Using Scanner
In this post we’ll see how to read delimited file (like CSV) in Java using Scanner class.
A Scanner, when reading input, breaks its input into tokens using a delimiter pattern, which by default matches whitespace.
The scanner can also use delimiters other than whitespace. Scanner class has useDelimiter() method which can be used to change default delimiter. There are two overloaded useDelimiter() methods.
- useDelimiter(Pattern pattern)— Sets this scanner’s delimiting pattern to the specified pattern.
- useDelimiter(String pattern)— Sets this scanner’s delimiting pattern to a pattern constructed from the specified String.
Java program to read CSV file using Scanner
Let’s see an example where Scanner class is used to read a CSV file.
If there is a CSV file with following data-
Pride And Prejudice,Jane Austen,20.76 The Murder of Roger Ackroyd,Agatha Christie,25.67 Atlas Shrugged,Ayn Rand,34.56 Gone with the Wind,Margaret Mitchell,36.78
And you want to read and parse the line so that you have Book name, author and price as separate strings.
import java.io.File; import java.io.IOException; import java.util.Scanner; public class ScanDelimited < public static void main(String[] args) < // CSV file File file = new File("G:\\Temp.csv"); Scanner sc = null; try < sc = new Scanner(file); // Check if there is another line of input while(sc.hasNextLine())< String str = sc.nextLine(); parseLine(str); >> catch (IOException exp) < // TODO Auto-generated catch block exp.printStackTrace(); >sc.close(); > private static void parseLine(String str) < String book, author, price; Scanner sc = new Scanner(str); sc.useDelimiter(","); // Check if there is another line of input while(sc.hasNext())< book = sc.next(); author = sc.next(); price = sc.next(); System.out.println("Book - " + book + " Author - " + author + " Price - " + price); >sc.close(); > >
Book - Pride And Prejudice Author - Jane Austen Price - 20.76 Book - The Murder of Roger Ackroyd Author - Agatha Christie Price - 25.67 Book - Atlas Shrugged Author - Ayn Rand Price - 34.56 Book - Gone with the Wind Author - Margaret Mitchell Price - 36.78
Java program to read pipe (|) delimited file using Scanner
If you have a file where pipe is used as delimiter then you can specify that as delimiter with useDelimiter() method to read the file.
Pride And Prejudice|Jane Austen|20.76 The Murder of Roger Ackroyd|Agatha Christie|25.67 Atlas Shrugged|Ayn Rand|34.56 Gone with the Wind|Margaret Mitchell|36.78
package org.netjs.examples1; import java.io.File; import java.io.IOException; import java.util.Scanner; public class ScanDelimited < public static void main(String[] args) < // delimited file File file = new File("G:\\abc.txt"); Scanner sc = null; try < sc = new Scanner(file); // Check if there is another line of input while(sc.hasNextLine())< String str = sc.nextLine(); parseLine(str); >> catch (IOException exp) < // TODO Auto-generated catch block exp.printStackTrace(); >sc.close(); > private static void parseLine(String str) < String book, author, price; Scanner sc = new Scanner(str); sc.useDelimiter("[|]"); // Check if there is another line of input while(sc.hasNext())< book = sc.next(); author = sc.next(); price = sc.next(); System.out.println("Book - " + book + " Author - " + author + " Price - " + price); >sc.close(); > >
Book - Pride And Prejudice Author - Jane Austen Price - 20.76 Book - The Murder of Roger Ackroyd Author - Agatha Christie Price - 25.67 Book - Atlas Shrugged Author - Ayn Rand Price - 34.56 Book - Gone with the Wind Author - Margaret Mitchell Price - 36.78
That’s all for this topic Reading Delimited File in Java Using Scanner. If you have any doubt or any suggestions to make please drop a comment. Thanks!
How do I read a delimited file in Java?
1- Using Scanner class with useDelimiter() method. 2- Read file using BufferedReader line by line and then split each line using split() method.
How do I read a csv file in Java?
What does a delimiter do in Java?
In Java, delimiters are the characters that split (separate) the string into tokens. Java allows us to define any characters as a delimiter. There are many string split methods provides by Java that uses whitespace character as a delimiter. The whitespace delimiter is the default delimiter in Java.
How do you identify a delimiter in a text file?
Just read a few lines, count the number of commas and the number of tabs and compare them. If there’s 20 commas and no tabs, it’s in CSV. If there’s 20 tabs and 2 commas (maybe in the data), it’s in TSV.
What is the delimiter in a csv file?
A tab-delimited or comma-separated value (CSV) file are text format files. … This character is called the field separator or delimiter. When the field separator (delimiter) is a comma, the file is in comma-separated (CSV) or comma-delimited format. Another popular delimiter is the tab.
What is a delimiter in SAS?
The dlm= option can be used to specify the delimiter that separates the variables in your raw data file. For example, dlm=’,’indicates a comma is the delimiter (e.g., a comma separated file, . csv file). Or, dlm=’09’x indicates that tabs are used to separate your variables (e.g., a tab separated file).
What is Opencsv?
opencsv is a very simple csv (comma-separated values) parser library for Java. It was developed because all of current csv parsers I’ve come across don’t have commercial-friendly licenses.
Can Java read Excel files?
Although it is not an opened file format, Java applications can still read and write Excel files using the Apache POI – the Java API for Microsoft Documents, because the development team uses reverse-engineering to understand the Excel file format. Hence the name POI stands for Poor Obfuscation Implementation.
How do you read a comma separated integer in Java?
In order to parse a comma-delimited String, you can just provide a “,” as a delimiter and it will return an array of String containing individual values. The split() function internally uses Java’s regular expression API (java. util.
What is use delimiter?
The useDelimiter() is a Java Scanner class method which is used to set the delimiting pattern of the Scanner which is in using. There is two different types of Java useDelimiter() method which can be differentiated depending on its parameter. … Java Scanner useDelimiter(String pattern) Method.
Is object class final in Java?
You can declare some or all of a class’s methods final. You use the final keyword in a method declaration to indicate that the method cannot be overridden by subclasses. The Object class does this—a number of its methods are final .