2010-02-21 60 views
7

tôi đã thực hiện một tập tin cấu hình nó có một số dạng sauCách đọc tệp khóa = giá trị và cách tách chuỗi được phân cách bằng dấu phẩy?

variableName = value 
variableName = value 
variableName = value 

Tôi biết tôi có thể đọc tập tin chia nhỏ chúng lưu trữ chúng trong biến. Nhưng tôi đang tìm kiếm một cách dễ dàng. Ví dụ tôi muốn lưu trữ tên biến và giá trị của nó trong một tệp và tôi muốn khi tôi đọc tệp, nó sẽ tự động khôi phục các biến và giá trị của nó. (Tôi biết làm thế nào để làm điều đó trong php và nó là rất dễ dàng nhưng tôi không phải là chuyên gia java :()

Câu hỏi thứ hai của tôi là về tập tin sau đây đọc Tôi có một tập tin có hàng và colums nó có thể được CSV Ví dụ

one,two,three 
four,five,six 
seven,eight,nine 

tôi muốn đọc nó mà nó trở lại toàn bộ cột ví dụ (một bốn bảy) tương tự cho những người khác. tôi không muốn sử dụng OpenCSV như ứng dụng không csv định hướng của nó chỉ dành riêng cho một chức năng.

CHỈNH SỬA:


Có thể viết tất cả tên biến và giá trị của nó và khi tôi đọc tệp, nó tự động khai báo biến đó và gán giá trị không?

+2

Bạn nên đặt hai câu hỏi của mình dưới dạng hai câu hỏi được đăng riêng :) –

+0

Cảm ơn, tôi sẽ ghi nhớ. Nhưng tôi nghĩ cả hai câu hỏi có liên quan đến nhau nên tôi có thể hỏi cùng một lúc – user238384

+0

về câu hỏi cuối cùng: bạn có thể gán giá trị cho các biến trong lớp bằng cách sử dụng sự phản chiếu, không chắc chắn về việc khai báo các biến mới động. – jutky

Trả lời

7

Sử dụng java.util.Properties để đọc trong tệp key=value. Here is a Sun tutorial.

Đối với CSV, bạn có thể đọc tất cả các dòng và sử dụng String#split() để ngắt từng dòng thành một mảng giá trị.

+0

cảm ơn câu trả lời của bạn. Có cách nào khác cho CSV không? Đối với khóa = giá trị, vui lòng giải thích thêm một chút nếu bạn có thể chỉ dẫn bất kỳ hướng dẫn nào, liên quan đến điều này, vui lòng gửi cho tôi liên kết là có thể lưu các biến và giá trị và khôi phục chúng? – user238384

+0

Tôi đã cải thiện câu trả lời. – BalusC

+0

Cảm ơn, Nó đã giúp tôi cho câu hỏi đầu tiên. Nhưng đối với CSV. Tôi có thể phân chia nó đầu tiên trong dòng sau đó mỗi dòng trong mảng với cho các vòng và chia. Nhưng bạn không nghĩ rằng đó là cách hiệu quả để làm điều đó ?? Đó là lý do tại sao tôi hỏi nếu bạn có thể đề nghị bất kỳ cách nào khác như bạn đề nghị tài sản :) – user238384

0

Thử đọc mọi thứ và sử dụng cụm từ thông dụng chia danh sách thành mảng 2 chiều.

+0

Điều này sẽ không hoạt động để phân tích cú pháp CSV tệp có thể có giá trị được trích dẫn chứa dấu phẩy. –

2

Lớp Properties sẽ tải tệp cấu hình của bạn ở định dạng tên = giá trị. Gọi phương thức tải với FileReader vào tệp cấu hình. Bạn có thể truy cập bất kỳ biến nào bằng phương thức getProperty.

Properties props = new Properties(); 
props.load(new FileReader(configFilePath); 

String value = props.getProperty("name"); 

Đối với các tập tin CSV, nếu tất cả các hàng có cùng số của các giá trị, bạn có thể đọc từng dòng vào một mảng sử dụng String.split ("") và gán nó vào một mảng 2-d. Sau đó truy cập "cột" bằng cách đi bộ mảng 2 chiều.

+0

Không sử dụng đường dẫn tương đối trong công cụ Java IO. Nó nhận được sự cố. Hoặc sử dụng đường dẫn tuyệt đối, hoặc theo cách thông thường - chỉ cần đặt tệp trong classpath và sử dụng 'ClassLoader # getResourceAsStream()'. – BalusC

+0

TUYỆT VỜI! ! ! bất kỳ đề xuất nào cho CSV ?? – user238384

+0

@BalusC Tôi đồng ý. Đã xóa ví dụ không hợp lệ. – marklai

1
  • 1 câu hỏi: kiểm tra Serialization
  • 2 câu hỏi: Xin vui lòng xem mã nguồn này:

    class RowReader { 
    private String path; 
    private String columnSeparator; 
    private List<String[]> rows; 
    private int columnCount; 
    public RowReader(String path, String columnSeparator) { 
        this.path = path; 
        this.columnSeparator = columnSeparator; 
        this.rows = getRows(); 
        if (this.rows == null || this.rows.size() == 0) 
         this.columnCount = 0; 
        else 
         this.columnCount = this.rows.get(0).length; 
    } 
    
    public List<String> getColumn(int i) { 
        List<String> column = new ArrayList<String>(); 
        for (String[] row : rows) { 
         column.add(row[i]); 
        } 
        return column; 
    } 
    
    public int getColumnCount() { 
        return columnCount; 
    } 
    
    private List<String[]> getRows() { 
        List<String[]> rows = new ArrayList<String[]>(); 
        try { 
         FileInputStream fstream = new FileInputStream(path); 
         DataInputStream in = new DataInputStream(fstream); 
         BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
         String line = null; 
         while ((line = br.readLine()) != null) { 
          rows.add(line.split(columnSeparator)); 
         } 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        return rows; 
    }} 
    

Kiểm tra lớp:

public class Program { 
    public static void main(String[] args) { 
     RowReader reader = new RowReader("j:\\test.txt", ","); 
     for (int i = 0; i < reader.getColumnCount(); i++) { 
      List<String> column = reader.getColumn(i); 
      for (String c : column) 
       System.out.print(c + ", "); 
      System.out.println(); 
     } 
    } 
} 

điều khiển đầu ra:

one, four, seven, 
two, five, eight, 
three, six, nine, 
+0

WOW! ! ! bạn đã viết toàn bộ mã ngay bây giờ ????? nó đã giúp tôi rất nhiều. Cảm ơn rất nhiều. – user238384

+0

Điều này sẽ không hoạt động để phân tích tệp CSV, có thể có giá trị được trích dẫn chứa dấu phẩy. –

+0

Phần mềm Monkey, Cảm ơn các ý kiến. Nhưng tôi nghĩ anh ấy đang cố gắng cho tôi một ý tưởng hay để nó hoạt động. Tôi có ý tưởng. Tôi có thể thực hiện nó :) – user238384

Các vấn đề liên quan