This question already has answers here:
Getting java.lang.NumberFormatException in the code
(3 answers)
Closed 2 years ago.
I'm reading in from a file that contains an item name and its quantity. I'm getting a NumberFormatExpression when I try to convert the quantity amount to an int. I feel it may be due to the - sign, but even after removing the - it stills throws the exception
String line = reader.readLine();
while (line != null) {
String[] delimiter = line.split(",");
int originalQuantity = Integer.parseInt(delimiter[1]);
line = reader.readLine();
}
the file contents:
Toilet Papers, -10
Hand sanitizers, 12
You're including a space at the beginning of the number. Use the trim method to get rid of it.
String line = reader.readLine();
while (line != null) {
String[] delimiter = line.split(",");
int originalQuantity = Integer.parseInt(delimiter[1].trim()); // <-- trim here
line = reader.readLine();
}
Related
This question already has answers here:
BufferedReader is skipping every other line when reading my file in java
(3 answers)
Closed 3 years ago.
private static List<Book> readDataFromCSV(String fileName) {
List<Book> books = new ArrayList<>();
Path pathToFile = Paths.get(fileName);
// create an instance of BufferedReader
// using try with resource, Java 7 feature to close resources
try (BufferedReader br = Files.newBufferedReader(pathToFile,
StandardCharsets.US_ASCII)) {
// read the first line from the text file
String line = br.readLine();
// loop until all lines are read
while ((line = br.readLine())!= null) {
// use string.split to load a string array with the values from
// each line of
// the file, using a comma as the delimiter
String[] attributes = line.split("\\|");
Book book = createBook(attributes);
// adding book into ArrayList
books.add(book);
// read next line before looping
// if end of file reached, line would be null
line = br.readLine();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
return books;
}
private static Book createBook(String[] metadata) {
String name = metadata[0];
String author = metadata[1]; // create and return book of this metadata
return new Book(name, price, author);
}
The above code skips every second line from text file (a csv file).
It gives data of alternate lines and it uses Java 7 syntax.
Please provide some suggestion what is wrong or how to improve it.
Remove the br.readLine() inside the while condition i.e.
// read the first line from the text file
String line = br.readLine();
// loop until all lines are read
while (line != null)
{
...
// read next line before looping
// if end of file reached, line would be null
line = br.readLine();
}
You have called the br.readLine() function twice in the loop.
One is in the condition:
while((line = br.readLine()) != null)
and the second one is at end of the loop.
So the loop is actually reading a line at the end, and then reading the next line at the beginning without processing it. To avoid this, you can remove the br.readLine at the end of the loop.
while ((line = br.readLine())!= null)
{
// use string.split to load a string array with the values from
// each line of
// the file, using a comma as the delimiter
String[] attributes = line.split("\\|");
Book book = createBook(attributes);
// adding book into ArrayList
books.add(book);
}
If you did not get it, the condition:
while((line = br.readLine()) != null)
is actually doing the following:
storing the returned value of br.readLine() in the variable line,
and then checking the condition. Therefore, you do not need to call it again in the loop.
This question already has answers here:
How can I read comma separated values from a text file in Java?
(6 answers)
How do I split a string in Java?
(39 answers)
Closed 3 years ago.
I want to load data from a text file as required for part of a basic project. E.g. a text file can look like this:
201,double,70.00,2,own bathroom
202,single,50.00,2,own bathroom
Each piece of data is seperated by a comma, and in this case goes in the order: room number, room type, cost, amount of people, with/without bathroom and there's 5 data for each room and each room information is on a new line.
The code below reads each line individually, but how do I get it to read and store each data/word from the line (without the comma obviously)?
try{
BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
String line = reader.readLine();
while (line != null){
System.out.println(line);
line = reader.readLine();
}
reader.close();
} catch(IOException ex){
System.out.println(ex.getMessage());
}
I saw an example using scanner but I heard that it's slower and less efficient.
I also tried using split but I can't figure out how to do it properly.
Thanks.
You can use Files.readAllLines() method and map the data to the dedicated object. Assuming you have such Room object with appropriate constructor you can read and store data like:
List<String> strings = Files.readAllLines(Paths.get("test.txt"));
List<Room> rooms = new ArrayList<>();
for (String line : strings) {
String[] split = line.split(",");
Integer roomNumber = Integer.valueOf(split[0]);
String roomType = split[1];
Double roomCost = Double.valueOf(split[2]);
Integer amount = Integer.valueOf(split[3]);
String bathroom = split[4];
Room r = new Room(roomNumber, roomType, roomCost, amount, bathroom);
rooms.add(r);
}
Then you can get the information for some room for example by room number:
Room room = rooms.stream()
.filter(r -> r.getRoomNumber() == 102)
.findFirst().orElseThrow(NoSuchElementException::new);
Note: If you are using java10 or above you can use orElseThrow() without parameters
You can split the line by the comma , and get an array of values:
try{
BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
String line = reader.readLine();
String data[] = null;
while (line != null){
System.out.println(line);
line = reader.readLine();
data = line.split(","); //data will have the values as an array
}
reader.close();
} catch(IOException ex){
System.out.println(ex.getMessage());
}
If I´m not wrong then the described format is the csv format ( https://en.wikipedia.org/wiki/Comma-separated_values)
Here is good overview how you can read csv data:
https://www.baeldung.com/java-csv-file-array
This question already has answers here:
What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?
(26 answers)
Closed 4 years ago.
So i want to read a String and an int from a text file and it gets me java.lang.ArrayIndexOutOfBoundsException: 1
public class GetNameAndNumber{
private ArrayList <NameAndNumber> list = new ArrayList <NameAndNumber>();
BufferedReader buf = new BufferedReader(new FileReader("NameAndNumber.txt"));
String linie = buf.readLine();
while(true)
{
linie = buf.readLine();
if(linie == null)
break;
else
{
String split[] = linie.split(" ");
NameAndNumber nan = new NameAndNumber(split[0], Integer.parseInt(split[1]));
list.add(nan);
}
}
}
the "NameAndNumber" class has a String and an int
and this is the text file:
John 1
David 0
Ringo 55
What i don't know is why this one gives me an error, but when i read 2 strings and then an int like
NameAndNumber nan = new NameAndNumber(split[0], split[1], Integer.parseInt(split[2])); - this "NameAndNumber" having two strings and an int
for a text file like
Johnny John 8
Mathew John 0
it gives me no errors and stores the values correctly. why ?
You most likely have a line without 2 strings on it. Maybe a blank line at the end of the file. I would suggest adding code to display each line right after you read it in, for debugging purposes. Then you can see where the bad line is in your input file.
linie = buf.readLine();
System.out.println("line: '" + linie + "'");
You could add additional code to skip lines that don't have two strings.
String split[] = linie.split(" ");
if (split.length < 2) continue; // skip bad input
I am assuming in you first file you have some empty spaces, because I ran your code and it worked fine. I made it fail by adding some empty spaces at the end with the Index out of exception.
One thing you can do it add some checks as follows by doing a trim and checking if the line is empty.
linie = buf.readLine().trim();
if(linie == null || linie.isEmpty())
break;
Try this
for(;;) {
String line = bufferedReader.readLine();
if (line == null) {
break;
}
}
This question already has answers here:
Parse and read data from a text file [duplicate]
(3 answers)
How to use java.util.Scanner to correctly read user input from System.in and act on it?
(1 answer)
Effective way to read file and parse each line
(3 answers)
parsing each line in text file java
(7 answers)
Closed 5 years ago.
I got .txt file with nationalities and phone numbers in different formats and all these in single quote symbols, also it contains empty lines (''):
''
'French'
'1-500'
'0345134123'
''
''
'German'
etc
after I parse with the help of readLine() I got arr[0] with each of these lines.
I need to put lines into different arrays: lines with 'nationality' into one array and lines with 'phone numbers' into other.
I tried this
if(!arr[0].equals("''")){
String[] arr1 = arr[0].split("'");
if(!arr1[1].matches("[0-9]+)"){
nations[n] = arr1[1];
n++;
}
else {
phone_numbers[p] = arr1[1];
p++;
}
}
Ofcourse it didn't work
In your question you said that you want
to put lines into different arrays: lines with 'nationality' into one array and lines with 'phone numbers' into other.
public static void main(String[] args) {
try{
File file = new File("path\\to\\yourfile");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line = "";
String nationalities = "";
String phones = "";
while((line = br.readLine()) != null){
String[] s = line.split("'");
if(s.length > 0){
if(s[1].matches("[a-zA-Z]+")){
// nationalities
nationalities += (nationalities.isEmpty()) ? s[1] : " " + s[1];
}else{
// line with phone numbers
phones += (phones.isEmpty()) ? s[1] : " " + s[1];
}
}
}
String[] nationArr = nationalities.split(" ");
String[] phoneArr = phones.split(" ");
for(String val : nationArr){
System.out.println(val);
}
System.out.println("------------");
for(String val : phoneArr){
System.out.println(val);
}
}catch(IOException e){
System.out.println("Error");
}
}
I tested with this text file
''
'French'
'1-500'
'0345134123'
''
''
'Japan'
'2-200'
'08078933444'
''
''
''
'Germany'
'2-300'
'00078933444'
''
You will get two array, nationality[nationArr] and line with phone[phoneArr].
Here is the answer.
French
Japan
Germany
------------
1-500
0345134123
2-200
08078933444
2-300
00078933444
I would suggest implementing some sort of system to differentiate between the types of lines. You could put 'n' at the start of the line for nationality, then detect it in your code.... Or if you knew the exact order of these lines e.g. nationality,number,nationality,number... you could easily separate these lines e.g. lineNumber%numOfLineTypes==0 would give you the first type of line...
This question already has answers here:
What is a NullPointerException, and how do I fix it?
(12 answers)
Closed 5 years ago.
I am tring to read a file which has lines like so:
438782 Abaca bunchy top virus NC_010314 Musa Sp.
So the lines contain information seperated by tabs. I am tring to read this file and do something with every line after splitting them. It keeps throwing a NullPointerException error though. This always happens on the line where I try to split. In the code below I left everything unrelated to this issue out.
BufferedReader br = new BufferedReader(new FileReader(filename));
String nextLine = br.readLine();
String[] line;
while (nextLine != null) {
nextLine = br.readLine();
line = nextLine.split("\t"); //Error line
//Do something with line
}
This line should be the last one inside your while loop, not the first
nextLine = br.readLine();