2010-02-21 15 views
7

我做它有一些格式如下如何讀取key = value文件以及如何拆分逗號分隔的字符串?

variableName = value 
variableName = value 
variableName = value 

一個配置文件,我知道我可以讀取文件分割它們將它們存儲在變量。但我正在尋找一個簡單的方法。例如,我想將變量名稱及其值存儲在一個文件中,我希望在讀取文件時自動恢復變量及其值。 (我知道如何做到這一點在PHP和它是很容易的,但我不是java專家:()

我的第二個問題是關於下面的文件讀取。我有一個文件,有行和列 它可以是CSV ,例如

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

我想讀它,它例如(一四七)同其他人返回整列。我不想用OpenCSV作爲它不是面向CSV的應用程序只是一個功能。

編輯:


是否可以寫入所有變量名稱及其值,當我讀取文件時,它會自動聲明這些變量並賦值?

+2

你應該問你兩個問題作爲兩個問題單獨發佈:) – 2010-02-21 03:20:46

+0

謝謝,我會記住。但我認爲這兩個問題都是相互關聯的,因此我可以同時詢問 – user238384 2010-02-21 03:39:15

+0

最後一個問題:您可以使用反射將值分配給類中的變量,不確定是否需要動態聲明新變量。 – jutky 2010-02-21 04:58:56

回答

7

使用java.util.Properties來讀取key=value文件。 Here is a Sun tutorial

至於CSV,您可以讀取所有行,並使用String#split()將每行分隔爲一組值。

+0

感謝您的回覆。有沒有其他方式的CSV? 對於關鍵=值請多解釋一點,如果你可以點任何教程,有關這個東西,請給我鏈接 是否有可能保存變量和值並恢復它們? – user238384 2010-02-21 03:24:24

+0

我改進了答案。 – BalusC 2010-02-21 03:26:02

+0

謝謝,它幫助我解決了第一個問題。但對於CSV。我可以先將它分成幾行,然後再將每一行分爲for循環和split。但你不認爲這是有效的方法嗎?這就是爲什麼我問你是否可以推薦任何其他方式,如你推薦的屬性:) – user238384 2010-02-21 03:38:47

0

嘗試閱讀所有內容,並使用正則表達式將列表拆分爲2維數組。

+0

這將無法解析CSV文件,其中可以包含帶逗號的引用值。 – 2010-02-21 04:06:54

2

Properties類將以name = value格式加載您的配置文件。用配置文件FileReader調用load方法。您可以使用getProperty方法訪問任何變量。

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

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

至於CSV文件,如果所有的行具有相同的數量的值,可以讀每一行到一個數組使用String.split(「」),並將其分配到一個2-d陣列。然後通過走2-d數組訪問「列」。

+0

不要在Java IO中使用相對路徑。這是麻煩的收據。要麼使用絕對路徑,要麼 - 通常的方式 - 只要將文件放在classpath中並使用'ClassLoader#getResourceAsStream()'。 – BalusC 2010-02-21 03:29:27

+0

太棒了! ! ! 對CSV的任何建議? – user238384 2010-02-21 03:37:23

+0

@BalusC我同意。刪除了不好的例子。 – marklai 2010-02-21 03:39:11

1
  • 1問題:檢查Serialization
  • 2提問:請參閱此源代碼:

    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; 
    }} 
    

測試類:

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(); 
     } 
    } 
} 

控制檯輸出:

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

哇! ! ! 你現在寫完整的代碼????? 它幫助我很多。非常感謝。 – user238384 2010-02-21 03:58:50

+0

這不適用於解析CSV文件,該文件可能包含逗號引用的值。 – 2010-02-21 04:06:17

+0

Software Monkey,感謝您的評論。但我認爲他試圖給我一個好主意,所以它的工作。我有想法。我可以實現它:) – user238384 2010-02-21 04:09:05

相關問題