Import a CSV file into a 2D String array

I need to read a text file in a 2d array.

The only problem I ran into is the width of the array with a maximum size of 9 columns. I do not know how many lines there will be.

Some rows will have, for example, 6 columns, and some will have 9.

here is a small section of my CSV file:

1908,Souths,Easts,Souths,Cumberland,Y,14,12,4000 1909,Souths,Balmain,Souths,Wests,N 1910,Newtown,Souths,Newtown,Wests,Y,4,4,14000 1911,Easts,Glebe,Glebe,Balmain,Y,11,8,20000 1912,Easts,Glebe,Easts,Wests,N 1913,Easts,Newtown,Easts,Wests,N 

and here is my code so far

  import java.io.*; import java.util.*; public class ass2 { public static void main(String[] args) throws IOException { readData(); } public static void readData() throws IOException{ BufferedReader dataBR = new BufferedReader(new FileReader(new File("nrldata.txt"))); String line = ""; ArrayList<String[]> dataArr = new ArrayList<String[]>(); //An ArrayList is used because I don't know how many records are in the file. while ((line = dataBR.readLine()) != null) { // Read a single line from the file until there are no more lines to read String[] club = new String[9]; // Each club has 3 fields, so we need room for the 3 tokens. for (int i = 0; i < 9; i++) { // For each token in the line that we've read: String[] value = line.split(",", 9); club[i] = value[i]; // Place the token into the 'i'th "column" } dataArr.add(club); // Add the "club" info to the list of clubs. } for (int i = 0; i < dataArr.size(); i++) { for (int x = 0; x < dataArr.get(i).length; x++) { System.out.printf("dataArr[%d][%d]: ", i, x); System.out.println(dataArr.get(i)[x]); } } } 

The error I am getting is:

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 at ass2.readData(ass2.java:23) at ass2.main(ass2.java:7) 

Someone can help: '(

Thanks!

+4
source share
4 answers

The problem is your inner loop. You are trying to access 9 value elements, no matter how many values ​​exist in the row. First, you must transfer the assignment to value , which should be before the inner loop. Then you need to limit the loop iterations to a minimum of 9 and a length of value :

 String[] value = line.split(",", 9); int n = Math.min(value.length, data.length); for (int i = 0; i < n; i++) { // For each token in the line that we've read: data[i] = value[i]; // Place the token into the 'i'th "column" } 

Note that the final data elements will be null .

+2
source

You can use OpenCSV to read the CSV file.

 // Read all CSVReader csvReader = new CSVReader(new FileReader(new File("nrldata.txt"))); List<String[]> list = csvReader.readAll(); // Convert to 2D array String[][] dataArr = new String[list.size()][]; dataArr = list.toArray(dataArr); 
+11
source

You get an error because you are trying to access the 7th token (index 6) in a line containing only 6. Replace this:

 for (int i = 0; i < 9; i++) { // For each token in the line that we've read: String[] value = line.split(",", 9); data[i] = value[i]; // Place the token into the 'i'th "column" } 

with this:

 String[] value = line.spkit(",", 9); // Split the line into max. 9 tokens for (int i = 0; i < value.length; i++) { data[i] = value[i]; // Add each token to data[] } 

In fact, you could replace the entire while-loop body with this single-line layer:

 dataArr.add(Arrays.copyOf(line.split(",", 9), 9)); 

See also this short demo .

+1
source

Instead of an array, you can use ArrayList for List . Since List is growing dynamically, you also don't need to think about it.

 List<List<String>> dataArr = new ArrayList<List<String>>(); 

and

 while ((line = dataBR.readLine()) != null){ for (int i = 0; i < 9; i++) dataArr.add(Arrays.asList(line.split(",", 9))); } 
0
source

Source: https://habr.com/ru/post/1483076/


All Articles