2010-02-21 14 views
7

Hice un archivo de configuración que tiene algún formato siguiente¿Cómo leer el archivo key = value y cómo dividir una cadena separada por comas?

variableName = value 
variableName = value 
variableName = value 

Sé que puedo leer el archivo de dividirlas los almacenan en la variable. Pero estoy buscando una manera fácil. Por ejemplo, quiero almacenar nombres de variables y su valor en un archivo y quiero que cuando lea el archivo, restaure automáticamente las variables y sus valores. (Sé cómo hacerlo en PHP y es muy fácil, pero no soy experto en Java :()

Mi segunda pregunta es acerca de la lectura de archivo siguiente. Tengo un archivo que tiene filas y columnas puede ser CSV , por ejemplo

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

quiero leerlo que devuelva toda la columna, por ejemplo, (uno de cuatro de siete) mismo para los demás. no quiero usar OpenCSV como su aplicación no csv orientada sólo para una función.

Editado:


¿Es posible escribir todo el nombre de variable y su valor y cuando leo el archivo declara automáticamente esas variables y asigna valores?

+2

Debe hacer sus dos preguntas como dos preguntas publicadas por separado :) –

+0

Gracias, lo tendré en cuenta. Pero pensé que ambas preguntas están relacionadas entre sí, así que puedo preguntar al mismo tiempo – user238384

+0

acerca de la última pregunta: puede asignar valores a las variables en la clase mediante el uso de la reflexión, no estoy seguro sobre la declaración de nuevas variables de forma dinámica. – jutky

Respuesta

7

Utilice java.util.Properties para leer en el archivo key=value. Here is a Sun tutorial.

En cuanto al CSV, puede leer en todas las líneas y usar String#split() para dividir cada línea en una matriz de valores.

+0

gracias por su respuesta. ¿Hay alguna otra forma de CSV? Para clave = valor, explique un poco más si puede señalar cualquier tutorial relacionado con esto, por favor envíeme el enlace ¿es posible guardar variables y valores y restaurarlos? – user238384

+0

He mejorado la respuesta. – BalusC

+0

Gracias, me ayudó para la primera pregunta. Pero para CSV. Puedo dividirlo primero en líneas, luego cada línea en el conjunto con bucles for y split. ¿Pero no crees que es una forma eficiente de hacerlo? Es por eso que le pregunté si puede recomendar de otra manera como usted las propiedades recomendadas :) – user238384

0

Intenta leer todo y usa una expresión regular dividiendo la lista en una matriz de 2 d.

+0

Esto no funcionará para analizar un archivo CSV archivo, que puede tener valores cotizados que contienen comas. –

2

La clase Properties cargará su archivo de configuración en el formato name = value. Llame al método de carga con un FileReader al archivo de configuración. Puedes acceder a cualquier variable usando el método getProperty.

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

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

En cuanto al archivo CSV, si todas las filas tienen el mismo número de valores, se puede leer cada línea en una matriz mediante String.split ("") y asignarlo a una matriz 2-D. Luego acceda a una "columna" recorriendo el conjunto de 2 d.

+0

No utilice rutas relativas en cosas Java IO. Es un recibo de problemas. Utilice rutas absolutas o, de la forma habitual, simplemente coloque el archivo en classpath y use 'ClassLoader # getResourceAsStream()'. – BalusC

+0

¡EXCELENTE! ! ! alguna sugerencia para CSV ?? – user238384

+0

@BalusC Estoy de acuerdo. Se eliminó el mal ejemplo. – marklai

1
  • 1 pregunta: comprobar Serialization
  • 2 pregunta: Por favor, vea el código fuente:

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

clase de prueba: salida

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

Consola:

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

¡GUAU! ! ! escribiste el código completo en este momento ????? me ayudó mucho. Muchas gracias. – user238384

+0

Esto no funcionará para analizar un archivo CSV, que puede tener valores cotizados que contengan comas. –

+0

Software Monkey, Gracias por los comentarios. Pero creo que estaba tratando de darme una buena idea para que funcionara. Tengo una idea. Puedo implementarlo :) – user238384

Cuestiones relacionadas