X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=basic%2Fruntime%2Forg.argeo.basic.nodeps%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Futil%2FCsvParser.java;h=3a429f4adc23a634dfcff402203a20e2c83e04d0;hb=6bb0606505be3e99021c5ff9771c719eb1e1f2e7;hp=ca81bc98305700e3be83f5ebac44c02f8718f40b;hpb=a6182afd9f9c3db2b995a6d5d2f65eeea628576c;p=lgpl%2Fargeo-commons.git diff --git a/basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/util/CsvParser.java b/basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/util/CsvParser.java index ca81bc983..3a429f4ad 100644 --- a/basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/util/CsvParser.java +++ b/basic/runtime/org.argeo.basic.nodeps/src/main/java/org/argeo/util/CsvParser.java @@ -29,22 +29,28 @@ public abstract class CsvParser { * * @param lineNumber * the current line number, starts at 1 (the header, if header - * processing is enabled, the first lien otherwise) + * processing is enabled, the first line otherwise) * @param header * the read-only header or null if {@link #setNoHeader(Boolean)} * is true (default is false) * @param tokens - * the parse tokens + * the parsed tokens */ protected abstract void processLine(Integer lineNumber, List header, List tokens); public synchronized void parse(InputStream in) { + parse(in, null); + } + + public synchronized void parse(InputStream in, String encoding) { BufferedReader reader = null; Integer lineCount = 0; try { - reader = new BufferedReader(new InputStreamReader(in)); - + if (encoding == null) + reader = new BufferedReader(new InputStreamReader(in)); + else + reader = new BufferedReader(new InputStreamReader(in, encoding)); List header = null; if (!noHeader) { String headerStr = reader.readLine(); @@ -55,6 +61,9 @@ public abstract class CsvParser { StringBuffer currStr = new StringBuffer(""); Boolean wasInquote = false; while (parseLine(headerStr, header, currStr, wasInquote)) { + headerStr = reader.readLine(); + if (headerStr == null) + break; wasInquote = true; } header = Collections.unmodifiableList(header); @@ -111,7 +120,7 @@ public abstract class CsvParser { StringBuffer currStr, Boolean wasInquote) { // List tokens = new ArrayList(); - //System.out.println("#LINE: " + str); + // System.out.println("#LINE: " + str); if (wasInquote) currStr.append('\n'); @@ -124,8 +133,13 @@ public abstract class CsvParser { if (c == separator) { if (!inQuote) { tokens.add(currStr.toString()); - //System.out.println("# TOKEN: " + currStr); + // System.out.println("# TOKEN: " + currStr); currStr.delete(0, currStr.length()); + } else { + // we don't remove separator that are in a quoted substring + // System.out + // .println("IN QUOTE, got a separator: [" + c + "]"); + currStr.append(c); } } else if (c == quote) { if (inQuote && (i + 1) < arr.length && arr[i + 1] == quote) { @@ -142,7 +156,7 @@ public abstract class CsvParser { if (!inQuote) { tokens.add(currStr.toString()); - //System.out.println("# TOKEN: " + currStr); + // System.out.println("# TOKEN: " + currStr); } // if (inQuote) // throw new ArgeoException("Missing quote at the end of the line "