Mặc dù sử dụng thư viện Apache CSV như đã đề cập bởi @ Minjun.Y là hoàn toàn tốt đẹp, tôi cố gắng cung cấp một giải pháp đó là gần gũi hơn với mã của bạn và có thể dễ dàng hơn để bạn có thể làm theo:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class CsvParser {
public static void main(String[] args) {
String fileName= "read_ex.csv";
File file= new File(fileName);
// this gives you a 2-dimensional array of strings
List<List<String>> lines = new ArrayList<>();
Scanner inputStream;
try{
inputStream = new Scanner(file);
while(inputStream.hasNext()){
String line= inputStream.next();
String[] values = line.split(",");
// this adds the currently parsed line to the 2-dimensional string array
lines.add(Arrays.asList(values));
}
inputStream.close();
}catch (FileNotFoundException e) {
e.printStackTrace();
}
// the following code lets you iterate through the 2-dimensional array
int lineNo = 1;
for(List<String> line: lines) {
int columnNo = 1;
for (String value: line) {
System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value);
columnNo++;
}
lineNo++;
}
}
}
Đi thôi qua nó bước-by-step:
tôi đã thêm hơn 3 nhập khẩu: ArrayList
, Arrays
và List
- bạn sẽ thấy rất sớm cho những gì họ đang tốt. Tất cả chúng đều được lấy từ thư viện java.util
, một thư viện chuẩn có sẵn với mọi JDK.
Mỗi tên lớp trong Java bắt đầu bằng chữ hoa (theo quy ước - nó sẽ xây dựng với một chữ cái nhỏ, nhưng bạn nên quen với quy ước này) - tôi "cố định" điều này trong mã của bạn.
Tôi đã thêm mảng 2 chiều List<List<String>> lines = new ArrayList<>()
. Điều này có vẻ hơi khó hiểu lúc đầu, nhưng điều đó có nghĩa là chúng ta tạo một biến số lines
giữ kết quả phân tích cú pháp của chúng ta. Cú pháp List<String>
có nghĩa là chúng ta có một số generic typeList
có thông số kiểu String
- nói cách khác: một danh sách các chuỗi. Toàn bộ List<List<String>>
có nghĩa là chúng ta có một danh sách các danh sách các chuỗi, một mảng chuỗi 2 chiều.
Với lines.add(Arrays.asList(values))
trong vòng while
của bạn, chúng tôi có thể thêm các dòng mà bạn đã phân tích cú pháp vào mảng 2 chiều này. Arrays.asList(values)
chuyển mảng String[]
thành List
vì chúng tôi cần nó tương thích với loại List<List<...>>
của chúng tôi. Điều này cho phép các dòng của bạn có độ dài thay đổi.
Dòng cuối cùng tôi thêm vào chỉ đơn giản là in nội dung của mảng 2 chiều và sẽ cho bạn một ví dụ tốt về cách truy cập các giá trị trong mảng này. Nếu bạn cần trợ giúp thêm cho cấu trúc này, hãy kiểm tra foreach loop documentation.
Do đây là một tập tin đầu vào (read_ex.csv
):
value_1-1,value_1-2,value_1-3,value_1-4
value_2-1,value_2-2,value_2-3,value_2-4
value_3-1,value_3-2,value_3-3,value_3-4
value_4-1,value_4-2,value_4-3,value_4-4
value_5-1,value_5-2,value_5-3,value_5-4
Chương trình sẽ in ra như sau:
Line 1 Column 1: value_1-1
Line 1 Column 2: value_1-2
Line 1 Column 3: value_1-3
Line 1 Column 4: value_1-4
Line 2 Column 1: value_2-1
Line 2 Column 2: value_2-2
Line 2 Column 3: value_2-3
Line 2 Column 4: value_2-4
Line 3 Column 1: value_3-1
Line 3 Column 2: value_3-2
Line 3 Column 3: value_3-3
Line 3 Column 4: value_3-4
Line 4 Column 1: value_4-1
Line 4 Column 2: value_4-2
Line 4 Column 3: value_4-3
Line 4 Column 4: value_4-4
Line 5 Column 1: value_5-1
Line 5 Column 2: value_5-2
Line 5 Column 3: value_5-3
Line 5 Column 4: value_5-4
Hope this helps :)
Nguồn
2016-10-16 21:02:43
@Micheal Lihs, Cảm ơn bạn đã biết chi tiết. Bạn anserwed câu hỏi của tôi cũng như một vài người khác! – mikeL
Bạn được chào đón! Hy vọng bạn thích Java :-) –
Tôi đã tìm một số thứ như thế này :) cảm ơn câu trả lời –