2010-02-21 16 views
7

Ho fatto un file di configurazione che ha alcune seguente formatoCome leggere il file key = value e come dividere una stringa separata da virgola?

variableName = value 
variableName = value 
variableName = value 

so di poter leggere il file dividerli conservarle in variabili. Ma sto cercando un modo semplice. Ad esempio, voglio memorizzare i nomi delle variabili e il loro valore in un file e voglio che quando leggo il file esso ripristini automaticamente le variabili e i suoi valori. (So ​​come farlo in PHP ed è molto facile ma non sono esperto java :()

La mia seconda domanda riguarda il seguente file letto. Ho un file che ha righe e colonne può essere CSV , per esempio

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

voglio leggerlo che tornare intera colonna per esempio (uno a quattro a sette) lo stesso per gli altri. non voglio usare OpenCSV come la sua applicazione non csv orientata solo per una funzione.

Modificato:


È possibile scrivere tutto il nome della variabile e il suo valore e quando leggo il file esso dichiara automaticamente tali variabili e assegna valori?

+2

Si dovrebbero porre le due domande come due domande inviate separatamente :) –

+0

Grazie, terrò a mente. Ma ho pensato che entrambe le domande siano interconnesse, quindi posso chiedere allo stesso tempo – user238384

+0

sull'ultima domanda: puoi assegnare valori alle variabili nella classe usando la reflection, non sono sicuro di dichiarare le nuove variabili dinamicamente. – jutky

risposta

7

Utilizzare java.util.Properties per leggere nel file key=value. Here is a Sun tutorial.

Per quanto riguarda il CSV, è possibile leggere tutte le righe e utilizzare String#split() per suddividere ciascuna riga in una matrice di valori.

+0

grazie per la tua risposta. C'è un altro modo per CSV? Per key = value per favore spiegami un po 'di più se riesci a puntare qualsiasi tutorial, relativo a questa cosa mandami il link è possibile salvare variabili e valori e ripristinarli? – user238384

+0

Ho migliorato la risposta. – BalusC

+0

Grazie, mi ha aiutato per la prima domanda. Ma per CSV. Posso dividerlo prima in righe poi in ogni riga in array con per loop e split. Ma non pensi che sia un modo efficace per farlo ?? Questo è il motivo per cui ti ho chiesto se puoi consigliare in qualsiasi altro modo come hai consigliato le proprietà :) – user238384

0

Provare a leggere tutto e utilizzare un'espressione regolare suddividendo l'elenco in una matrice 2-d.

+0

Questo non funzionerà per l'analisi di un CSV file, che può avere valori quotati contenenti virgole. –

2

La classe Properties carica il file di configurazione nel formato nome = valore. Chiamare il metodo di caricamento con un FileReader nel file di configurazione. Puoi accedere a qualsiasi variabile usando il metodo getProperty.

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

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

Come per il file CSV, se tutte le righe hanno lo stesso numero di valori, è possibile leggere ogni riga in un array usando String.split ("") e assegnare ad una matrice 2-d. Quindi accedi a una "colonna" camminando sulla matrice 2-d.

+0

Non utilizzare percorsi relativi in ​​roba I/O Java. È ricevuta per problemi. O usate i percorsi assoluti, o - al solito modo - inserite il file in classpath e usate 'ClassLoader # getResourceAsStream()'. – BalusC

+0

GRANDE! ! ! qualche suggerimento per CSV ?? – user238384

+0

@BalusC Sono d'accordo. Rimosso cattivo esempio. – marklai

1
  • 1 domanda: controllare Serialization
  • 2 domanda: Si prega di vedere il codice sorgente:

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

classe Test: uscita

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

Console:

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

WOW! ! ! hai scritto tutto il codice adesso ????? mi ha aiutato molto. Molte grazie. – user238384

+0

Ciò non funzionerà per l'analisi di un file CSV, che può avere valori quotati contenenti virgole. –

+0

Software Monkey, Grazie per i commenti. Ma penso che stava cercando di darmi una buona idea, quindi ha funzionato. Ho idea. Posso implementarlo :) – user238384

Problemi correlati