What is the best way to read comma delimited configuration file?

I have a comma delimited file. Empty lines are ignored and there should be errors in invalid lines:

Foo bar

foo2, bar3

I want to read this file in HashMap , where the key (foo) is displayed with the value (bar).

What is the best way to do this?

+4
source share
4 answers

If you can use x = y instead of x, y, you can use the Properties class.

If you need to have x, y, look at java.util.Scanner , you can set a separator to use as a separator (javadoc shows examples of this).

 import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; class Main { public static void main(final String[] argv) { final File file; file = new File(argv[0]); try { final Scanner scanner; scanner = new Scanner(file); while(scanner.hasNextLine()) { if(scanner.hasNext(".*,")) { String key; final String value; key = scanner.next(".*,").trim(); if(!(scanner.hasNext())) { // pick a better exception to throw throw new Error("Missing value for key: " + key); } key = key.substring(0, key.length() - 1); value = scanner.next(); System.out.println("key = " + key + " value = " + value); } } } catch(final FileNotFoundException ex) { ex.printStackTrace(); } } } 

and property versions (easier to parse because they are not)

 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.Properties; class Main { public static void main(final String[] argv) { Reader reader; reader = null; try { final Properties properties; reader = new BufferedReader( new FileReader(argv[0])); properties = new Properties(); properties.load(reader); System.out.println(properties); } catch(final IOException ex) { ex.printStackTrace(); } finally { if(reader != null) { try { reader.close(); } catch(final IOException ex) { ex.printStackTrace(); } } } } } 
+6
source

It is best to use the java.util.Scanner class to read values ​​in the configuration file, using a comma as a separator. Link here to Javadoc:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html

Example:

 Scanner sc = new Scanner(new File("thing.config")); sc.useDelimiter(","); while (sc.hasNext()) { String token = sc.next(); } 
+5
source
 try { BufferedReader cfgFile = new BufferedReader(new FileReader(new File("config.file"))); String line = null; // Read the file line by line while ((line = cfgFile.readLine()) != null) { line.trim(); // Ignore empty lines if (!rec.equals("")) { String [] fields = line.split(","); String key = fields[0]; String value = fields[1]; // TODO: Check for more than 2 fields // TODO: Add key, value pair to Hashmap } // if } // while cfgFile.close(); } catch (IOException e) { System.out.println("Unexpected File IO Error"); } 
0
source

I personally use a can of a guy named Stephen Estermiller, who is his Labeled CSV parser. Here is a sample code.

 LabeledCSVParser lcsvp = new LabeledCSVParser( new CSVParser( new StringReader( "Name,Phone\n" + "Stewart,212-555-3233\n" + "Cindy,212-555-8492\n" ) ) ); while(lcsvp.getLine() != null){ System.out.println( "Name: " + lcsvp.getValueByLabel("Name") ); System.out.println( "Phone: " + lcsvp.getValueByLabel("Phone") ); } 
0
source

All Articles