diff --git a/src/main/java/org/apache/commons/csv/CSVParser.java b/src/main/java/org/apache/commons/csv/CSVParser.java index 7b5b849f..11842047 100644 --- a/src/main/java/org/apache/commons/csv/CSVParser.java +++ b/src/main/java/org/apache/commons/csv/CSVParser.java @@ -19,6 +19,7 @@ package org.apache.commons.csv; import java.io.IOException; import java.io.Reader; +import java.io.StringReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -140,6 +141,16 @@ public class CSVParser implements Iterable { this.format = format; } + /** + * Customized CSV parser using the given {@link CSVFormat} + * + * @param input a String containing "csv-formatted" input + * @param format the CSVFormat used for CSV parsing + */ + public CSVParser(String input, CSVFormat format) { + this(new StringReader(input), format); + } + // ====================================================== // the parser // ====================================================== diff --git a/src/main/java/org/apache/commons/csv/CSVUtils.java b/src/main/java/org/apache/commons/csv/CSVUtils.java deleted file mode 100644 index be051057..00000000 --- a/src/main/java/org/apache/commons/csv/CSVUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.csv; - -import java.io.IOException; -import java.io.StringReader; - -/** - * Utility methods for dealing with CSV files - */ -public class CSVUtils { - - private static final String[] EMPTY_STRING_ARRAY = new String[0]; - private static final String[][] EMPTY_DOUBLE_STRING_ARRAY = new String[0][0]; - - /** - *

CSVUtils instances should NOT be constructed in - * standard programming. - * - *

This constructor is public to permit tools that require a JavaBean - * instance to operate.

- */ - public CSVUtils() { - } - - // ====================================================== - // static parsers - // ====================================================== - - /** - * Parses the given String according to the default {@link CSVFormat}. - * - * @param s CSV String to be parsed. - * @return parsed String matrix (which is never null) - * @throws IOException in case of error - */ - public static String[][] parse(String s) throws IOException { - if (s == null) { - throw new IllegalArgumentException("Null argument not allowed."); - } - String[][] result = (new CSVParser(new StringReader(s))).getRecords(); - if (result == null) { - // since CSVFormat ignores empty lines an empty array is returned - // (i.e. not "result = new String[][] {{""}};") - result = EMPTY_DOUBLE_STRING_ARRAY; - } - return result; - } - - /** - * Parses the first line only according to the default {@link CSVFormat}. - * - * Parsing empty string will be handled as valid records containing zero - * elements, so the following property holds: parseLine("").length == 0. - * - * @param s CSV String to be parsed. - * @return parsed String vector (which is never null) - * @throws IOException in case of error - */ - public static String[] parseLine(String s) throws IOException { - if (s == null) { - throw new IllegalArgumentException("Null argument not allowed."); - } - // uh,jh: make sure that parseLine("").length == 0 - if (s.length() == 0) { - return EMPTY_STRING_ARRAY; - } - return (new CSVParser(new StringReader(s))).getLine(); - } - -} diff --git a/src/test/java/org/apache/commons/csv/CSVParserTest.java b/src/test/java/org/apache/commons/csv/CSVParserTest.java index 7bd74d23..987ddb7e 100644 --- a/src/test/java/org/apache/commons/csv/CSVParserTest.java +++ b/src/test/java/org/apache/commons/csv/CSVParserTest.java @@ -244,7 +244,7 @@ public class CSVParserTest extends TestCase { {""}, {"\"hello\"", " \"world\"", "abc\ndef", ""} }; - CSVParser parser = new CSVParser(new StringReader(code), CSVFormat.EXCEL); + CSVParser parser = new CSVParser(code, CSVFormat.EXCEL); String[][] tmp = parser.getRecords(); assertEquals(res.length, tmp.length); assertTrue(tmp.length > 0); @@ -262,7 +262,7 @@ public class CSVParserTest extends TestCase { {""}, {"world", ""} }; - CSVParser parser = new CSVParser(new StringReader(code), CSVFormat.EXCEL); + CSVParser parser = new CSVParser(code, CSVFormat.EXCEL); String[][] tmp = parser.getRecords(); assertEquals(res.length, tmp.length); assertTrue(tmp.length > 0); @@ -289,7 +289,7 @@ public class CSVParserTest extends TestCase { }; for (String code : codes) { - CSVParser parser = new CSVParser(new StringReader(code), CSVFormat.EXCEL); + CSVParser parser = new CSVParser(code, CSVFormat.EXCEL); String[][] tmp = parser.getRecords(); assertEquals(res.length, tmp.length); assertTrue(tmp.length > 0); @@ -314,9 +314,7 @@ public class CSVParserTest extends TestCase { {"hello", ""}, // CSV format ignores empty lines {"world", ""} }; - String code; - for (int codeIndex = 0; codeIndex < codes.length; codeIndex++) { - code = codes[codeIndex]; + for (String code : codes) { CSVParser parser = new CSVParser(new StringReader(code)); String[][] tmp = parser.getRecords(); assertEquals(res.length, tmp.length); @@ -339,10 +337,8 @@ public class CSVParserTest extends TestCase { {""}, // Excel format does not ignore empty lines {""} }; - String code; - for (int codeIndex = 0; codeIndex < codes.length; codeIndex++) { - code = codes[codeIndex]; - CSVParser parser = new CSVParser(new StringReader(code), CSVFormat.EXCEL); + for (String code : codes) { + CSVParser parser = new CSVParser(code, CSVFormat.EXCEL); String[][] tmp = parser.getRecords(); assertEquals(res.length, tmp.length); assertTrue(tmp.length > 0); @@ -362,9 +358,7 @@ public class CSVParserTest extends TestCase { String[][] res = { {"hello", ""} // CSV format ignores empty lines }; - String code; - for (int codeIndex = 0; codeIndex < codes.length; codeIndex++) { - code = codes[codeIndex]; + for (String code : codes) { CSVParser parser = new CSVParser(new StringReader(code)); String[][] tmp = parser.getRecords(); assertEquals(res.length, tmp.length); @@ -440,7 +434,7 @@ public class CSVParserTest extends TestCase { CSVFormat format = new CSVFormat(',', '\'', CSVFormat.DISABLED, '/', false, false, true, true); - CSVParser parser = new CSVParser(new StringReader(code), format); + CSVParser parser = new CSVParser(code, format); String[][] tmp = parser.getRecords(); assertTrue(tmp.length > 0); for (int i = 0; i < res.length; i++) { @@ -468,7 +462,7 @@ public class CSVParserTest extends TestCase { CSVFormat format = new CSVFormat(',', CSVFormat.DISABLED, CSVFormat.DISABLED, '/', false, false, true, true); - CSVParser parser = new CSVParser(new StringReader(code), format); + CSVParser parser = new CSVParser(code, format); String[][] tmp = parser.getRecords(); assertTrue(tmp.length > 0); @@ -495,7 +489,7 @@ public class CSVParserTest extends TestCase { CSVFormat format = CSVFormat.DEFAULT; assertEquals(CSVFormat.DISABLED, format.getCommentStart()); - CSVParser parser = new CSVParser(new StringReader(code), format); + CSVParser parser = new CSVParser(code, format); String[][] tmp = parser.getRecords(); assertTrue(tmp.length > 0); @@ -510,7 +504,7 @@ public class CSVParserTest extends TestCase { }; format = new CSVFormat(',', '"', '#'); - parser = new CSVParser(new StringReader(code), format); + parser = new CSVParser(code, format); tmp = parser.getRecords(); if (!CSVPrinterTest.equals(res_comments, tmp)) { @@ -521,7 +515,7 @@ public class CSVParserTest extends TestCase { public void testUnicodeEscape() throws IOException { String code = "abc,\\u0070\\u0075\\u0062\\u006C\\u0069\\u0063"; - CSVParser parser = new CSVParser(new StringReader(code), CSVFormat.DEFAULT.withUnicodeEscapesInterpreted(true)); + CSVParser parser = new CSVParser(code, CSVFormat.DEFAULT.withUnicodeEscapesInterpreted(true)); String[] data = parser.iterator().next(); assertEquals(2, data.length); assertEquals("abc", data[0]); diff --git a/src/test/java/org/apache/commons/csv/CSVUtilsTest.java b/src/test/java/org/apache/commons/csv/CSVUtilsTest.java deleted file mode 100644 index 15718f55..00000000 --- a/src/test/java/org/apache/commons/csv/CSVUtilsTest.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.csv; - -import java.io.IOException; - -import junit.framework.TestCase; - -/** - * CSVUtilsTest - */ -public class CSVUtilsTest extends TestCase { - - // ====================================================== - // static parser tests - // ====================================================== - public void testParse1() throws IOException { - String[][] data = CSVUtils.parse("abc\ndef"); - assertEquals(2, data.length); - assertEquals(1, data[0].length); - assertEquals(1, data[1].length); - assertEquals("abc", data[0][0]); - assertEquals("def", data[1][0]); - } - - public void testParse2() throws IOException { - String[][] data = CSVUtils.parse("abc,def,\"ghi,jkl\"\ndef"); - assertEquals(2, data.length); - assertEquals(3, data[0].length); - assertEquals(1, data[1].length); - assertEquals("abc", data[0][0]); - assertEquals("def", data[0][1]); - assertEquals("ghi,jkl", data[0][2]); - assertEquals("def", data[1][0]); - } - - public void testParse3() throws IOException { - String[][] data = CSVUtils.parse("abc,\"def\nghi\"\njkl"); - assertEquals(2, data.length); - assertEquals(2, data[0].length); - assertEquals(1, data[1].length); - assertEquals("abc", data[0][0]); - assertEquals("def\nghi", data[0][1]); - assertEquals("jkl", data[1][0]); - } - - public void testParse4() throws IOException { - String[][] data = CSVUtils.parse("abc,\"def\\\\nghi\"\njkl"); - assertEquals(2, data.length); - assertEquals(2, data[0].length); - assertEquals(1, data[1].length); - assertEquals("abc", data[0][0]); - // an escape char in quotes only escapes a delimiter, not itself - assertEquals("def\\\\nghi", data[0][1]); - assertEquals("jkl", data[1][0]); - } - - public void testParse5() throws IOException { - String[][] data = CSVUtils.parse("abc,def\\nghi\njkl"); - assertEquals(2, data.length); - assertEquals(2, data[0].length); - assertEquals(1, data[1].length); - assertEquals("abc", data[0][0]); - assertEquals("def\\nghi", data[0][1]); - assertEquals("jkl", data[1][0]); - } - - public void testParse6() throws IOException { - String[][] data = CSVUtils.parse(""); - // default format is CSV, which ignores empty lines - assertEquals(0, data.length); - } - - public void testParse7() throws IOException { - boolean io = false; - try { - CSVUtils.parse(null); - } catch (IllegalArgumentException e) { - io = true; - } - assertTrue(io); - } - - public void testParseLine1() throws IOException { - String[] data = CSVUtils.parseLine("abc,def,ghi"); - assertEquals(3, data.length); - assertEquals("abc", data[0]); - assertEquals("def", data[1]); - assertEquals("ghi", data[2]); - } - - public void testParseLine2() throws IOException { - String[] data = CSVUtils.parseLine("abc,def,ghi\n"); - assertEquals(3, data.length); - assertEquals("abc", data[0]); - assertEquals("def", data[1]); - assertEquals("ghi", data[2]); - } - - public void testParseLine3() throws IOException { - String[] data = CSVUtils.parseLine("abc,\"def,ghi\""); - assertEquals(2, data.length); - assertEquals("abc", data[0]); - assertEquals("def,ghi", data[1]); - } - - public void testParseLine4() throws IOException { - String[] data = CSVUtils.parseLine("abc,\"def\nghi\""); - assertEquals(2, data.length); - assertEquals("abc", data[0]); - assertEquals("def\nghi", data[1]); - } - - public void testParseLine5() throws IOException { - String[] data = CSVUtils.parseLine(""); - assertEquals(0, data.length); - // assertEquals("", data[0]); - } - - public void testParseLine6() throws IOException { - boolean io = false; - try { - CSVUtils.parseLine(null); - } catch (IllegalArgumentException e) { - io = true; - } - assertTrue(io); - } - - public void testParseLine7() throws IOException { - String[] res = CSVUtils.parseLine(""); - assertNotNull(res); - assertEquals(0, res.length); - } - -}