2016-10-16 20 views
5

Tôi hoàn toàn mới sử dụng java (chỉ mới bắt đầu trong tuần này). Tôi đang cố gắng để đọc các tập tin csv, "read_ex.csv", thành một mảng. Tôi đã tìm kiếm không ngừng trên web/satckoverflow để tìm cách đọc tệp vào một mảng. Tốt nhất tôi đã có thể làm là đọc nó trong một thời trang trực tuyến, nhưng tôi không thể lưu trữ nó trong một mảng do kích thước biến của tập tin. Tôi tin rằng ArrayList là một phương pháp để đối phó với mảng kích thước biến, nhưng tôi không biết làm thế nào để làm việc với nó. Về cơ bản tôi muốn có thể truy cập vào chuỗi "giá trị" mảng sau khi vòng lặp while kết thúc.đọc tệp csv vào một mảng

import java.util.Scanner; 
import java.io.FileNotFoundException; 
import java.io.File; 

public class sortarray { 
    public static void main (String []agrs){ 
     String fileName= "read_ex.csv"; 
     File file= new File(fileName); 


     try{ 
      Scanner inputStream= new Scanner(file); 
      while(inputStream.hasNext()){ 
      String data= inputStream.next(); 
      String[] values = data.split(","); 
      System.out.println(values[1]); 
      } 
      inputStream.close(); 
      }catch (FileNotFoundException e) { 
      e.printStackTrace(); 
    } 
    //This prints out the working directory 
    System.out.println("Present Project Directory : "+ System.getProperty("user.dir")); 

    }   

} 

Như tôi đã đề cập, tôi mới sử dụng java và wold được mở cho bất kỳ phương pháp nào đọc csv thành tệp mà người mới bắt đầu có thể hiểu.

Trả lời

11

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:

  1. tôi đã thêm hơn 3 nhập khẩu: ArrayList, ArraysList - 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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 :)

+0

@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

+0

Bạn được chào đón! Hy vọng bạn thích Java :-) –

+0

Tôi đã tìm một số thứ như thế này :) cảm ơn câu trả lời –

6

Tôi mới vào java và wold được mở cho bất kỳ phương pháp mà đọc một csv vào một tập tin mà một người mới bắt đầu có thể hiểu được.

Đây là giải pháp hiện tại dành cho bạn từ Apache Commons, dự án Apache Commons CSV. Xem số Apache Commons CSV parser guide.

Rất dễ sử dụng trong hộp.

Đây là một worfklow cơ bản:

  • Tạo một lớp học có các trường "trận đấu" các cột của csv tập tin.
  • Mỗi hàng trong csv của bạn là đối tượng của lớp đó với các thuộc tính tương ứng với các trường trong csv của bạn. Sử dụng thư viện để lấy từng trường và lưu trữ nó trong đối tượng của bạn trong một vòng lặp.
  • Trong vòng lặp của bạn, bạn sẽ lưu trữ các đối tượng với các lĩnh vực/tài sản đọc từ csv trong ArrayList
  • Sau khi vòng lặp kết thúc, ArrayList của bạn sẽ có những yếu tố rằng "trận đấu" các hàng trong tập tin csv của bạn. Bạn được tự do truy cập vào bất kỳ hàng/yếu tố nào trong danh sách.

Nếu bạn không quen với cách ListArrayList hoạt động trong Java, vui lòng tham khảo khá nhiều hướng dẫn trực tuyến Java bao gồm Oracle Tutorial.

Search Stackoverflow cho hàng trăm bài đăng về cách sử dụng Commons CSV.

+0

cảm ơn cho liên kết. Trong dòng "Iterable records = CSVFormat.EXCEL.parse (in);", tôi giả định "CSVRecord" là lớp, nhưng "CSVFormat.EXCEL.parse (in)" đề cập đến là gì. – mikeL

+0

@mikeL Thay vì đoán, hãy đọc tài liệu. Tài liệu lớp cho ['CSVFormat'] (https://commons.apache.org/proper/commons-csv/archives/1.4/apidocs/index.html) giải thích rằng năm định dạng khác nhau được hỗ trợ bởi Commons CSV. ['EXCEL'] (https://commons.apache.org/proper/commons-csv/archives/1.4/apidocs/org/apache/commons/csv/CSVFormat.html#EXCEL) là một hằng số (được xác định trước) đối tượng cho hương vị cụ thể của CSV được tạo bởi ứng dụng Microsoft Excel. Để trích dẫn: Định dạng tệp Excel (sử dụng dấu phẩy làm dấu phân cách giá trị). Lưu ý rằng dấu phân cách giá trị thực tế được Excel sử dụng phụ thuộc vào miền địa phương… –