From: <be...@us...> - 2006-10-24 23:33:52
|
Revision: 119 http://svn.sourceforge.net/pzfilereader/?rev=119&view=rev Author: benoitx Date: 2006-10-24 16:33:29 -0700 (Tue, 24 Oct 2006) Log Message: ----------- Optimised the ParserUtils to use char for delimiter and qualifier. I have added deprecated methods for Strings (using only the first character). Could you find out where these are used and remove the call to those and use the char instead. All tests are passed but we should add more... especially with regards to the multi line one... Time to hit the sack! Modified Paths: -------------- trunk/PZFileReader/qalab.xml trunk/PZFileReader/src/main/java/net/sf/pzfilereader/DataSet.java trunk/PZFileReader/src/main/java/net/sf/pzfilereader/LargeDataSet.java trunk/PZFileReader/src/main/java/net/sf/pzfilereader/util/ParserUtils.java trunk/PZFileReader/src/test/java/net/sf/pzfilereader/parserutils/ParserUtilsSplitLineTest.java trunk/PZFileReader/src/test/java/net/sf/pzfilereader/utilities/UnitTestUtils.java trunk/PZFileReaderSamples/qalab.xml Property Changed: ---------------- trunk/ trunk/PZFileReaderSamples/ Property changes on: trunk ___________________________________________________________________ Name: svn:ignore - target + target *.log Modified: trunk/PZFileReader/qalab.xml =================================================================== --- trunk/PZFileReader/qalab.xml 2006-10-24 21:36:11 UTC (rev 118) +++ trunk/PZFileReader/qalab.xml 2006-10-24 23:33:29 UTC (rev 119) @@ -59,6 +59,18 @@ <summaryresult date="2006-10-18" filecount="3" statvalue="116" type="simian"/> <summaryresult date="2006-10-18" filecount="14" statvalue="18" type="cobertura-line"/> <summaryresult date="2006-10-18" filecount="14" statvalue="24" type="cobertura-branch"/> + <summaryresult date="2006-10-20" filecount="19" statvalue="26" type="checkstyle"/> + <summaryresult date="2006-10-20" filecount="3" statvalue="5" type="pmd"/> + <summaryresult date="2006-10-20" filecount="6" statvalue="11" type="findbugs"/> + <summaryresult date="2006-10-20" filecount="3" statvalue="116" type="simian"/> + <summaryresult date="2006-10-20" filecount="14" statvalue="18" type="cobertura-line"/> + <summaryresult date="2006-10-20" filecount="14" statvalue="24" type="cobertura-branch"/> + <summaryresult date="2006-10-25" filecount="19" statvalue="26" type="checkstyle"/> + <summaryresult date="2006-10-25" filecount="3" statvalue="6" type="pmd"/> + <summaryresult date="2006-10-25" filecount="6" statvalue="12" type="findbugs"/> + <summaryresult date="2006-10-25" filecount="3" statvalue="106" type="simian"/> + <summaryresult date="2006-10-25" filecount="14" statvalue="20" type="cobertura-line"/> + <summaryresult date="2006-10-25" filecount="14" statvalue="27" type="cobertura-branch"/> </summary> <file id="com_pz_reader_ordering_package.html" path="com/pz/reader/ordering/package.html"> <result date="2006-10-05" statvalue="1" type="checkstyle"/> @@ -337,6 +349,10 @@ <result date="2006-10-17" statvalue="100" type="cobertura-branch"/> <result date="2006-10-18" statvalue="3" type="checkstyle"/> <result date="2006-10-18" statvalue="100" type="cobertura-branch"/> + <result date="2006-10-20" statvalue="3" type="checkstyle"/> + <result date="2006-10-20" statvalue="100" type="cobertura-branch"/> + <result date="2006-10-25" statvalue="3" type="checkstyle"/> + <result date="2006-10-25" statvalue="100" type="cobertura-branch"/> </file> <file id="net_sf_pzfilereader_DataSet.java" path="net/sf/pzfilereader/DataSet.java"> <result date="2006-10-17" statvalue="4" type="checkstyle"/> @@ -349,16 +365,32 @@ <result date="2006-10-18" statvalue="2" type="findbugs"/> <result date="2006-10-18" statvalue="21" type="cobertura-line"/> <result date="2006-10-18" statvalue="27" type="cobertura-branch"/> + <result date="2006-10-20" statvalue="5" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="pmd"/> + <result date="2006-10-20" statvalue="2" type="findbugs"/> + <result date="2006-10-20" statvalue="21" type="cobertura-line"/> + <result date="2006-10-20" statvalue="27" type="cobertura-branch"/> + <result date="2006-10-25" statvalue="5" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="pmd"/> + <result date="2006-10-25" statvalue="2" type="findbugs"/> + <result date="2006-10-25" statvalue="21" type="cobertura-line"/> + <result date="2006-10-25" statvalue="27" type="cobertura-branch"/> </file> <file id="net_sf_pzfilereader_LargeDataSet.java" path="net/sf/pzfilereader/LargeDataSet.java"> <result date="2006-10-17" statvalue="4" type="checkstyle"/> <result date="2006-10-18" statvalue="4" type="checkstyle"/> + <result date="2006-10-20" statvalue="4" type="checkstyle"/> + <result date="2006-10-25" statvalue="4" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_ordering_OrderBy.java" path="net/sf/pzfilereader/ordering/OrderBy.java"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-17" statvalue="2" type="findbugs"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="2" type="findbugs"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="2" type="findbugs"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="2" type="findbugs"/> </file> <file id="net_sf_pzfilereader_util_ParserUtils.java" path="net/sf/pzfilereader/util/ParserUtils.java"> <result date="2006-10-17" statvalue="4" type="checkstyle"/> @@ -371,6 +403,16 @@ <result date="2006-10-18" statvalue="3" type="findbugs"/> <result date="2006-10-18" statvalue="36" type="cobertura-line"/> <result date="2006-10-18" statvalue="43" type="cobertura-branch"/> + <result date="2006-10-20" statvalue="9" type="checkstyle"/> + <result date="2006-10-20" statvalue="3" type="pmd"/> + <result date="2006-10-20" statvalue="3" type="findbugs"/> + <result date="2006-10-20" statvalue="36" type="cobertura-line"/> + <result date="2006-10-20" statvalue="43" type="cobertura-branch"/> + <result date="2006-10-25" statvalue="9" type="checkstyle"/> + <result date="2006-10-25" statvalue="4" type="pmd"/> + <result date="2006-10-25" statvalue="4" type="findbugs"/> + <result date="2006-10-25" statvalue="43" type="cobertura-line"/> + <result date="2006-10-25" statvalue="52" type="cobertura-branch"/> </file> <file id="net_sf_pzfilereader_xml_PZMapParser.java" path="net/sf/pzfilereader/xml/PZMapParser.java"> <result date="2006-10-17" statvalue="4" type="checkstyle"/> @@ -379,31 +421,51 @@ <result date="2006-10-18" statvalue="4" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="pmd"/> <result date="2006-10-18" statvalue="1" type="findbugs"/> + <result date="2006-10-20" statvalue="4" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="pmd"/> + <result date="2006-10-20" statvalue="1" type="findbugs"/> + <result date="2006-10-25" statvalue="4" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="pmd"/> + <result date="2006-10-25" statvalue="1" type="findbugs"/> </file> <file id="net_sf_pzfilereader_xml_ResolveLocalDTD.java" path="net/sf/pzfilereader/xml/ResolveLocalDTD.java"> <result date="2006-10-17" statvalue="2" type="findbugs"/> <result date="2006-10-18" statvalue="2" type="findbugs"/> + <result date="2006-10-20" statvalue="2" type="findbugs"/> + <result date="2006-10-25" statvalue="2" type="findbugs"/> </file> <file id="net_sf_pzfilereader_structure_Row.java" path="net/sf/pzfilereader/structure/Row.java"> <result date="2006-10-17" statvalue="1" type="findbugs"/> <result date="2006-10-17" statvalue="44" type="cobertura-line"/> <result date="2006-10-18" statvalue="1" type="findbugs"/> <result date="2006-10-18" statvalue="44" type="cobertura-line"/> + <result date="2006-10-20" statvalue="1" type="findbugs"/> + <result date="2006-10-20" statvalue="44" type="cobertura-line"/> + <result date="2006-10-25" statvalue="1" type="findbugs"/> + <result date="2006-10-25" statvalue="44" type="cobertura-line"/> </file> <file id="net_sf_pzfilereader_structure_ColumnMetaData.java" path="net/sf/pzfilereader/structure/ColumnMetaData.java"> <result date="2006-10-17" statvalue="50" type="cobertura-line"/> <result date="2006-10-17" statvalue="100" type="cobertura-branch"/> <result date="2006-10-18" statvalue="50" type="cobertura-line"/> <result date="2006-10-18" statvalue="100" type="cobertura-branch"/> + <result date="2006-10-20" statvalue="50" type="cobertura-line"/> + <result date="2006-10-20" statvalue="100" type="cobertura-branch"/> + <result date="2006-10-25" statvalue="50" type="cobertura-line"/> + <result date="2006-10-25" statvalue="100" type="cobertura-branch"/> </file> <file id="net_sf_pzfilereader_Version.java" path="net/sf/pzfilereader/Version.java"> <result date="2006-10-17" statvalue="100" type="cobertura-branch"/> <result date="2006-10-18" statvalue="100" type="cobertura-branch"/> + <result date="2006-10-20" statvalue="100" type="cobertura-branch"/> + <result date="2006-10-25" statvalue="100" type="cobertura-branch"/> </file> <file id="net_sf_pzfilereader_xml_XMLRecordElement.java" path="net/sf/pzfilereader/xml/XMLRecordElement.java"> <result date="2006-10-17" statvalue="100" type="cobertura-branch"/> </file> <file id="net_sf_pzfilereader_util_PZConstants.java" path="net/sf/pzfilereader/util/PZConstants.java"> <result date="2006-10-18" statvalue="100" type="cobertura-branch"/> + <result date="2006-10-20" statvalue="100" type="cobertura-branch"/> + <result date="2006-10-25" statvalue="100" type="cobertura-branch"/> </file> </qalab> Modified: trunk/PZFileReader/src/main/java/net/sf/pzfilereader/DataSet.java =================================================================== --- trunk/PZFileReader/src/main/java/net/sf/pzfilereader/DataSet.java 2006-10-24 21:36:11 UTC (rev 118) +++ trunk/PZFileReader/src/main/java/net/sf/pzfilereader/DataSet.java 2006-10-24 23:33:29 UTC (rev 119) @@ -205,6 +205,7 @@ * Adds missing columns as empty's to the DataSet instead of * logging them as an error * @exception Exception + * @deprecated use the char version */ public DataSet(final Connection con, final File dataSource, final String dataDefinition, final String delimiter, final String qualifier, final boolean ignoreFirstRecord, final boolean handleShortLines) throws Exception { @@ -238,9 +239,43 @@ * Adds missing columns as empty's to the DataSet instead of * logging them as an error * @exception Exception + * @deprecated qualifier and delimiters should only be char. */ public DataSet(final Connection con, final InputStream dataSourceStream, final String dataDefinition, final String delimiter, final String qualifier, final boolean ignoreFirstRecord, final boolean handleShortLines) throws Exception { + this(con, dataSourceStream, dataDefinition, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier + .charAt(0) : 0, ignoreFirstRecord, handleShortLines); + } + + /** + * New constructor based on InputStream. Constructs a new DataSet using the + * database table file layout method. This is used for a DELIMITED text + * file. esacpe sequence reference: \n newline <br> + * \t tab <br> + * \b backspace <br> + * \r return <br> + * \f form feed <br> \\ backslash <br> \' single quote <br> \" double quote + * + * @param con - + * Connection to database with DATAFILE and DATASTRUCTURE tables + * @param dataSourceStream - + * text file datasource InputStream to read from + * @param dataDefinition - + * Name of dataDefinition in the DATAFILE table DATAFILE_DESC + * column + * @param delimiter - + * Char the file is delimited By + * @param qualifier - + * Char text is qualified by + * @param ignoreFirstRecord - + * skips the first line that contains data in the file + * @param handleShortLines - + * Adds missing columns as empty's to the DataSet instead of + * logging them as an error + * @exception Exception + */ + public DataSet(final Connection con, final InputStream dataSourceStream, final String dataDefinition, final char delimiter, + final char qualifier, final boolean ignoreFirstRecord, final boolean handleShortLines) throws Exception { super(); this.handleShortLines = handleShortLines; @@ -316,6 +351,7 @@ * Adds missing columns as empty's to the DataSet instead of * logging them as an error * @exception Exception + * @deprecated use the char version */ public DataSet(final File pzmapXML, final File dataSource, final String delimiter, final String qualifier, final boolean ignoreFirstRecord, final boolean handleShortLines) throws Exception { @@ -346,10 +382,41 @@ * Adds missing columns as empty's to the DataSet instead of * logging them as an error * @exception Exception + * @deprecated use the char version */ public DataSet(final InputStream pzmapXMLStream, final InputStream dataSourceStream, final String delimiter, final String qualifier, final boolean ignoreFirstRecord, final boolean handleShortLines) throws Exception { + this(pzmapXMLStream, dataSourceStream, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier + .charAt(0) : 0, ignoreFirstRecord, handleShortLines); + } + /** + * New constructor based on InputStream. Constructs a new DataSet using the + * PZMAP XML file layout method. This is used for a DELIMITED text file. + * esacpe sequence reference: \n newline <br> + * \t tab <br> + * \b backspace <br> + * \r return <br> + * \f form feed <br> \\ backslash <br> \' single quote <br> \" double quote + * + * @param pzmapXMLStream - + * Reference to the xml file holding the pzmap + * @param dataSourceStream - + * text file datasource InputStream to read from + * @param delimiter - + * Char the file is delimited By + * @param qualifier - + * Char text is qualified by + * @param ignoreFirstRecord - + * skips the first line that contains data in the file + * @param handleShortLines - + * Adds missing columns as empty's to the DataSet instead of + * logging them as an error + * @exception Exception + */ + public DataSet(final InputStream pzmapXMLStream, final InputStream dataSourceStream, final char delimiter, + final char qualifier, final boolean ignoreFirstRecord, final boolean handleShortLines) throws Exception { + this.handleShortLines = handleShortLines; columnMD = PZMapParser.parse(pzmapXMLStream); @@ -376,10 +443,38 @@ * of column headers will be added as empty's instead of * producing an error * @exception Exception + * @deprecated */ public DataSet(final File dataSource, final String delimiter, final String qualifier, final boolean handleShortLines) throws Exception { + this(dataSource, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier.charAt(0) : 0, + handleShortLines); + } + /** + * Constructs a new DataSet using the first line of data found in the text + * file as the column names. This is used for a DELIMITED text file. esacpe + * sequence reference: \n newline <br> + * \t tab <br> + * \b backspace <br> + * \r return <br> + * \f form feed <br> \\ backslash <br> \' single quote <br> \" double quote + * + * @param dataSource - + * text file datasource to read from + * @param delimiter - + * Char the file is delimited By + * @param qualifier - + * Char text is qualified by + * @param handleShortLines - + * when flaged as true, lines with less columns then the amount + * of column headers will be added as empty's instead of + * producing an error + * @exception Exception + */ + public DataSet(final File dataSource, final char delimiter, final char qualifier, final boolean handleShortLines) + throws Exception { + this.handleShortLines = handleShortLines; InputStream dataSourceStream = null; @@ -413,10 +508,38 @@ * of column headers will be added as empty's instead of * producing an error * @exception Exception + * @deprecated */ public DataSet(final InputStream dataSource, final String delimiter, final String qualifier, final boolean handleShortLines) throws Exception { + this(dataSource, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier.charAt(0) : 0, + handleShortLines); + } + /** + * Constructs a new DataSet using the first line of data found in the text + * file as the column names. This is used for a DELIMITED text file. esacpe + * sequence reference: \n newline <br> + * \t tab <br> + * \b backspace <br> + * \r return <br> + * \f form feed <br> \\ backslash <br> \' single quote <br> \" double quote + * + * @param dataSource - + * text file InputStream to read from + * @param delimiter - + * Char the file is delimited By + * @param qualifier - + * Char text is qualified by + * @param handleShortLines - + * when flaged as true, lines with less columns then the amount + * of column headers will be added as empty's instead of + * producing an error + * @exception Exception + */ + public DataSet(final InputStream dataSource, final char delimiter, final char qualifier, final boolean handleShortLines) + throws Exception { + this.handleShortLines = handleShortLines; try { @@ -556,7 +679,7 @@ * puts together the dataset for a DELIMITED file. This is used for PZ XML * mappings, and SQL table mappings */ - private void doDelimitedFile(final InputStream dataSource, final String delimiter, final String qualifier, + private void doDelimitedFile(final InputStream dataSource, final char delimiter, final char qualifier, final boolean ignoreFirstRecord, final boolean createMDFromFile) throws Exception { if (dataSource == null) { throw new NullPointerException("dataSource is null"); @@ -606,7 +729,7 @@ // be checked if we have specified a delimiter // ******************************************************** final char[] chrArry = line.trim().toCharArray(); - if (!processingMultiLine && delimiter != null && delimiter.trim().length() > 0) { + if (!processingMultiLine && delimiter > 0) { processingMultiLine = ParserUtils.isMultiLine(chrArry, delimiter, qualifier); } @@ -619,7 +742,8 @@ // excel will escape these with another quote; here is some // data "" This would indicate // there is more to the multiline - if (line.trim().endsWith(qualifier) && !line.trim().endsWith(qualifier + qualifier)) { + String trimmed = line.trim(); + if (trimmed.charAt(trimmed.length() - 1) == qualifier && !trimmed.endsWith("" + qualifier + qualifier)) { // it is safe to assume we have reached the end of the // line break processingMultiLine = false; @@ -645,7 +769,7 @@ // delimiter, then we have reached the end // of // the record - if (chrArry[i] == delimiter.charAt(0)) { + if (chrArry[i] == delimiter) { // processingMultiLine = false; // fix put in, setting to false caused // bug when processing multiple @@ -657,7 +781,7 @@ qualiFound = false; continue; } - } else if (chrArry[i] == qualifier.charAt(0)) { + } else if (chrArry[i] == qualifier) { qualiFound = true; } } @@ -1186,8 +1310,11 @@ } /** - * Erases the dataset early and releases memory for the JVM to reclaim, this invalidates the object. - * @deprecated You can still use it but truly you should keep the scope of the DataSet to a MINIMUM. + * Erases the dataset early and releases memory for the JVM to reclaim, this + * invalidates the object. + * + * @deprecated You can still use it but truly you should keep the scope of + * the DataSet to a MINIMUM. */ public void freeMemory() { if (rows != null) { Modified: trunk/PZFileReader/src/main/java/net/sf/pzfilereader/LargeDataSet.java =================================================================== --- trunk/PZFileReader/src/main/java/net/sf/pzfilereader/LargeDataSet.java 2006-10-24 21:36:11 UTC (rev 118) +++ trunk/PZFileReader/src/main/java/net/sf/pzfilereader/LargeDataSet.java 2006-10-24 23:33:29 UTC (rev 119) @@ -60,9 +60,9 @@ private boolean processedFirst = false; - private String delimiter = null; + private char delimiter = 0; - private String qualifier = null; + private char qualifier = 0; private int columnCount = 0; @@ -96,10 +96,42 @@ * Adds missing columns as empty's to the DataSet instead of * logging them as an error * @exception Exception + * @deprecated use the char version. */ public LargeDataSet(final InputStream pzmapXMLStream, final InputStream dataSourceStream, final String delimiter, final String qualifier, final boolean ignoreFirstRecord, final boolean handleShortLines) throws Exception { + this(pzmapXMLStream, dataSourceStream, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier + .charAt(0) : 0, ignoreFirstRecord, handleShortLines); + } + /** + * Constructor based on InputStream. Constructs a new LargeDataSet using the + * PZMAP XML file layout method. This is used for a DELIMITED text file. + * esacpe sequence reference:<br> + * \n newline <br> + * \t tab <br> + * \b backspace <br> + * \r return <br> + * \f form feed <br> \\ backslash <br> \' single quote <br> \" double quote + * + * @param pzmapXMLStream - + * Reference to the xml file holding the pzmap + * @param dataSourceStream - + * text file datasource InputStream to read from + * @param delimiter - + * Char the file is delimited By + * @param qualifier - + * Char text is qualified by + * @param ignoreFirstRecord - + * skips the first line that contains data in the file + * @param handleShortLines - + * Adds missing columns as empty's to the DataSet instead of + * logging them as an error + * @exception Exception + */ + public LargeDataSet(final InputStream pzmapXMLStream, final InputStream dataSourceStream, final char delimiter, + final char qualifier, final boolean ignoreFirstRecord, final boolean handleShortLines) throws Exception { + this.fileType = DELIMITED_FILE; this.is = dataSourceStream; this.isr = new InputStreamReader(is); @@ -133,9 +165,38 @@ * of column headers will be added as empty's instead of * producing an error * @exception Exception + * @deprecated use the char version */ public LargeDataSet(final File dataSource, final String delimiter, final String qualifier, final boolean handleShortLines) throws Exception { + this(dataSource, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier.charAt(0) : 0, + handleShortLines); + } + + /** + * Constructs a new LargeDataSet using the first line of data found in the + * text file as the column names. This is used for a DELIMITED text file. + * esacpe sequence reference:<br> + * \n newline <br> + * \t tab <br> + * \b backspace <br> + * \r return <br> + * \f form feed <br> \\ backslash <br> \' single quote <br> \" double quote + * + * @param dataSource - + * text file datasource to read from + * @param delimiter - + * Char the file is delimited By + * @param qualifier - + * Char text is qualified by + * @param handleShortLines - + * when flaged as true, lines with less columns then the amount + * of column headers will be added as empty's instead of + * producing an error + * @exception Exception + */ + public LargeDataSet(final File dataSource, final char delimiter, final char qualifier, final boolean handleShortLines) + throws Exception { this(ParserUtils.createInputStream(dataSource), delimiter, qualifier, handleShortLines); } @@ -160,9 +221,39 @@ * of column headers will be added as empty's instead of * producing an error * @exception Exception + * @deprecated use the char version */ public LargeDataSet(final InputStream dataSource, final String delimiter, final String qualifier, final boolean handleShortLines) throws Exception { + this(dataSource, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier.charAt(0) : 0, + handleShortLines); + } + + /** + * Constructs a new LargeDataSet using the first line of data found in the + * text file as the column names. This is used for a DELIMITED text file. + * esacpe sequence reference:<br> + * \n newline <br> + * \t tab <br> + * \b backspace <br> + * \r return <br> + * \f form feed <br> \\ backslash <br> \' single quote <br> \" double quote + * + * @param dataSource - + * text file datasource to read from + * @param delimiter - + * Char the file is delimited By + * @param qualifier - + * Char text is qualified by + * @param handleShortLines - + * when flaged as true, lines with less columns then the amount + * of column headers will be added as empty's instead of + * producing an error + * @exception Exception + */ + public LargeDataSet(final InputStream dataSource, final char delimiter, final char qualifier, final boolean handleShortLines) + throws Exception { + this.fileType = DELIMITED_FILE; setHandleShortLines(handleShortLines); this.is = dataSource; @@ -342,8 +433,9 @@ /** loop through each line in the file */ while ((line = br.readLine()) != null) { lineCount++; + String trimmed = line.trim(); /** empty line skip past it */ - if (!processingMultiLine && line.trim().length() == 0) { + if (!processingMultiLine && trimmed.length() == 0) { continue; } // check to see if the user has elected to skip the first record @@ -362,8 +454,8 @@ // any line breaks in the middle of the record, this will only // be checked if we have specified a delimiter // ******************************************************** - final char[] chrArry = line.trim().toCharArray(); - if (!processingMultiLine && delimiter != null && delimiter.trim().length() > 0) { + final char[] chrArry = trimmed.toCharArray(); + if (!processingMultiLine && delimiter > 0) { processingMultiLine = ParserUtils.isMultiLine(chrArry, delimiter, qualifier); } @@ -376,7 +468,7 @@ // excel will escape these with another quote; here is some data // "" This would indicate // there is more to the multiline - if (line.trim().endsWith(qualifier) && !line.trim().endsWith(qualifier + qualifier)) { + if (trimmed.charAt(trimmed.length() - 1) == qualifier && !trimmed.endsWith("" + qualifier + qualifier)) { // it is safe to assume we have reached the end of the line // break processingMultiLine = false; @@ -401,7 +493,7 @@ // not a space, if this char is the delimiter, // then we have reached the end of // the record - if (chrArry[i] == delimiter.charAt(0)) { + if (chrArry[i] == delimiter) { // processingMultiLine = false; // fix put in, setting to false caused bug // when processing multiple multi-line @@ -412,7 +504,7 @@ qualiFound = false; continue; } - } else if (chrArry[i] == qualifier.charAt(0)) { + } else if (chrArry[i] == qualifier) { qualiFound = true; } } Modified: trunk/PZFileReader/src/main/java/net/sf/pzfilereader/util/ParserUtils.java =================================================================== --- trunk/PZFileReader/src/main/java/net/sf/pzfilereader/util/ParserUtils.java 2006-10-24 21:36:11 UTC (rev 118) +++ trunk/PZFileReader/src/main/java/net/sf/pzfilereader/util/ParserUtils.java 2006-10-24 23:33:29 UTC (rev 119) @@ -44,6 +44,17 @@ } /** + * @deprecated should only use the splitLine with a CHAR. + * @param line + * @param delimiter + * @param qualifier + * @return + */ + public static List splitLine(String line, final String delimiter, final String qualifier) { + return splitLine(line, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier.charAt(0) : 0); + } + + /** * Returns an ArrayList of items in a delimited string. If there is no * qualifier around the text, the qualifier parameter can be left null, or * empty. There should not be any line breaks in the string. Each line of @@ -57,7 +68,7 @@ * qualifier which is surrounding the text * @return ArrayList */ - public static List splitLine(String line, final String delimiter, final String qualifier) { + public static List splitLine(String line, final char delimiter, final char qualifier) { final ArrayList list = new ArrayList(); // String temp = ""; boolean beginQualifier = false; @@ -73,12 +84,13 @@ // line which has not yet been read // check to see if there is a text qualifier final char currentChar = line.charAt(i); - if (qualifier != null && qualifier.trim().length() > 0) { - if (line.substring(i, i + 1).equals(qualifier) && !beginQualifier && !beginNoQualifier) { + final String currentString = String.valueOf(currentChar); + if (qualifier > 0) { + if (currentChar == qualifier && !beginQualifier && !beginNoQualifier) { // begining of a set of data beginQualifier = true; - } else if (!beginQualifier && !beginNoQualifier && !line.substring(i, i + 1).equals(qualifier) - && !lTrim(remainderOfLine).startsWith(qualifier)) { + } else if (!beginQualifier && !beginNoQualifier && currentChar != qualifier + && lTrim(remainderOfLine).charAt(0) != qualifier) { // try to account for empty space before qualifier starts // we have not yet begun a qualifier and the char we are on // is NOT @@ -87,18 +99,18 @@ // make sure that this is not just an empty column with no // qualifiers. ie // "data",,"data" - if (line.substring(i, i + 1).equals(delimiter)) { + if (currentChar == delimiter) { list.add(sb.toString()); sb.delete(0, sb.length()); beginNoQualifier = false; continue;// grab the next char } sb.append(currentChar); - } else if ((!beginNoQualifier) && line.substring(i, i + 1).equals(qualifier) && beginQualifier - && (lTrim(line.substring(i + 1)).length() == 0 + } else if (!beginNoQualifier && currentChar == qualifier && beginQualifier + && (i == line.length() - 1 || lTrim(remainderOfLine.substring(1)).length() == 0 // this will be true on empty undelmited columns at the // end of theline - || lTrimKeepTabs(line.substring(i + 1)).substring(0, 1).equals(delimiter))) { + || lTrimKeepTabs(remainderOfLine).charAt(1) == delimiter)) { // end of a set of data that was qualified list.add(sb.toString()); sb.delete(0, sb.length()); @@ -116,7 +128,7 @@ } else { i += offset; } - } else if (beginNoQualifier && line.substring(i, i + 1).equals(delimiter)) { + } else if (beginNoQualifier && currentChar == delimiter) { // check to see if we are done with an element that was not // being qulified list.add(sb.toString()); @@ -130,7 +142,7 @@ } else { // not using a qualifier. Using a delimiter only - if (line.substring(i, i + 1).equals(delimiter)) { + if (currentChar == delimiter) { list.add(sb.toString()); sb.delete(0, sb.length()); } else { @@ -139,17 +151,21 @@ } } + // + this needs to be revisited... + String trimmed = sb.toString().trim(); // remove the ending text qualifier if needed - if (qualifier != null && qualifier.trim().length() > 0 && sb.toString().trim().length() > 0) { - if (sb.toString().trim().substring(sb.toString().trim().length() - 1).equals(qualifier)) { - final String s = sb.toString().trim().substring(0, sb.toString().trim().length() - 1); + if (qualifier > 0 && trimmed.length() > 0) { + if (trimmed.charAt(trimmed.length() - 1) == qualifier) { + final String s = trimmed.substring(0, trimmed.length() - 1); sb.delete(0, sb.length()); sb.append(s); } } - if (qualifier == null || qualifier.trim().length() == 0 || beginQualifier || beginNoQualifier - || line.trim().endsWith(delimiter)) { + String trimmed2 = line.trim(); + int lengthLeft = trimmed2.length(); + if (qualifier <= 0 || beginQualifier || beginNoQualifier || lengthLeft > 0 + && trimmed2.charAt(lengthLeft - 1) == delimiter) { // also account for a delimiter with an empty column at the end that // was not qualified // check to see if we need to add the last column in..this will @@ -173,7 +189,7 @@ * @return int */ - public static int getDelimiterOffset(final String line, final int start, final String delimiter) { + public static int getDelimiterOffset(final String line, final int start, final char delimiter) { int idx = line.indexOf(delimiter, start); if (idx >= 0) { // idx++; @@ -338,7 +354,7 @@ continue; } - lineData = splitLine(line, delimiter, qualifier); + lineData = splitLine(line, delimiter.charAt(0), qualifier.charAt(0)); for (int i = 0; i < lineData.size(); i++) { final ColumnMetaData cmd = new ColumnMetaData(); cmd.setColName((String) lineData.get(i)); @@ -375,7 +391,7 @@ * @exception Exception * @return ArrayList - ColumnMetaData */ - public static Map getColumnMDFromFile(final String line, final String delimiter, final String qualifier) throws Exception { + public static Map getColumnMDFromFile(final String line, final char delimiter, final char qualifier) throws Exception { List lineData = null; final List results = new ArrayList(); final Map columnMD = new LinkedHashMap(); @@ -420,7 +436,7 @@ continue; } - lineData = splitLine(line, delimiter, qualifier); + lineData = splitLine(line, delimiter.charAt(0), qualifier.charAt(0)); for (int i = 0; i < lineData.size(); i++) { final ColumnMetaData cmd = new ColumnMetaData(); cmd.setColName((String) lineData.get(i)); @@ -471,12 +487,28 @@ * @param qualifier - * qualifier being used * @return boolean + * @deprecated use the char version */ public static boolean isMultiLine(final char[] chrArry, final String delimiter, final String qualifier) { + return isMultiLine(chrArry, delimiter != null ? delimiter.charAt(0) : 0, qualifier != null ? qualifier.charAt(0) : 0); + } + /** + * Determines if the given line is the first part of a multiline record + * + * @param chrArry - + * char data of the line + * @param delimiter - + * delimiter being used + * @param qualifier - + * qualifier being used + * @return boolean + */ + public static boolean isMultiLine(final char[] chrArry, final char delimiter, final char qualifier) { + // check if the last char is the qualifier, if so then this a good // chance it is not multiline - if (chrArry[chrArry.length - 1] != qualifier.charAt(0)) { + if (chrArry[chrArry.length - 1] != qualifier) { // could be a potential line break boolean qualiFound = false; for (int i = chrArry.length - 1; i >= 0; i--) { @@ -490,13 +522,13 @@ // not a space, if this char is the delimiter, then we // have a line break // in the record - if (chrArry[i] == delimiter.charAt(0)) { + if (chrArry[i] == delimiter) { return true; } qualiFound = false; continue; } - } else if (chrArry[i] == delimiter.charAt(0)) { + } else if (chrArry[i] == delimiter) { // if we have a delimiter followed by a qualifier, then we // have moved on // to a new element and this could not be multiline. start a @@ -505,13 +537,13 @@ for (int j = i - 1; j >= 0; j--) { if (chrArry[j] == ' ') { continue; - } else if (chrArry[j] == qualifier.charAt(0)) { + } else if (chrArry[j] == qualifier) { return false; } break; } - } else if (chrArry[i] == qualifier.charAt(0)) { + } else if (chrArry[i] == qualifier) { qualiFound = true; } } @@ -529,7 +561,7 @@ // the delimiter and qualifier continue; } - if (chrArry[i] == delimiter.charAt(0)) { + if (chrArry[i] == delimiter) { return true; } break; @@ -678,6 +710,7 @@ /** * Use this method to find the index of a column. + * * @author Benoit Xhenseval * @param key * @param columnMD @@ -759,9 +792,9 @@ * </p> * * <pre> - * StringUtils.padding(0, 'e') = "" - * StringUtils.padding(3, 'e') = "eee" - * StringUtils.padding(-2, 'e') = IndexOutOfBoundsException + * StringUtils.padding(0, 'e') = "" + * StringUtils.padding(3, 'e') = "eee" + * StringUtils.padding(-2, 'e') = IndexOutOfBoundsException * </pre> * * <p> @@ -794,6 +827,7 @@ /** * Build a map of name/position based on a list of ColumnMetaData. + * * @author Benoit Xhenseval * @param columns * @return a new Map @@ -805,7 +839,8 @@ int idx = 0; for (final Iterator it = columns.iterator(); it.hasNext(); idx++) { final ColumnMetaData meta = (ColumnMetaData) it.next(); - //map.put(meta.getColName(), Integer.valueOf(idx)); breaks 1.4 compile + // map.put(meta.getColName(), Integer.valueOf(idx)); breaks 1.4 + // compile map.put(meta.getColName(), new Integer(idx)); } } Modified: trunk/PZFileReader/src/test/java/net/sf/pzfilereader/parserutils/ParserUtilsSplitLineTest.java =================================================================== --- trunk/PZFileReader/src/test/java/net/sf/pzfilereader/parserutils/ParserUtilsSplitLineTest.java 2006-10-24 21:36:11 UTC (rev 118) +++ trunk/PZFileReader/src/test/java/net/sf/pzfilereader/parserutils/ParserUtilsSplitLineTest.java 2006-10-24 23:33:29 UTC (rev 119) @@ -7,127 +7,100 @@ import junit.framework.TestCase; /** - * Test the functionality of the splitLine method. This method returns - * a List of Strings. Each element of the list represents a column created - * by the parser from the delimited String. + * Test the functionality of the splitLine method. This method returns a List of + * Strings. Each element of the list represents a column created by the parser + * from the delimited String. * - * @author Paul Zepernick + * @author Paul Zepernick */ -public class ParserUtilsSplitLineTest extends TestCase{ - private static final String[] DELIMITED_DATA_NO_BREAKS = {"Column 1","Column 2", "Column 3", "Column 4", "Column 5"}; - private static final String[] DELIMITED_DATA_WITH_BREAKS = {"Column 1 \r\n\r\n Test After Break \r\n Another Break", - "Column 2", - "Column 3 \r\n\r\n Test After Break", - "Column 4", - "Column 5 \r\n\r\n Test After Break\r\n Another Break"}; - //TODO think of a situation that actually breaks the parse. This still works because of the way it is coded - //to handle the excel CSV. Excel CSV has some elements qualified and others not +public class ParserUtilsSplitLineTest extends TestCase { + private static final String[] DELIMITED_DATA_NO_BREAKS = { "Column 1", "Column 2", "Column 3", "Column 4", "Column 5" }; + + private static final String[] DELIMITED_DATA_WITH_BREAKS = { "Column 1 \r\n\r\n Test After Break \r\n Another Break", + "Column 2", "Column 3 \r\n\r\n Test After Break", "Column 4", "Column 5 \r\n\r\n Test After Break\r\n Another Break" }; + + // TODO think of a situation that actually breaks the parse. This still + // works because of the way it is coded + // to handle the excel CSV. Excel CSV has some elements qualified and others + // not private static final String DELIMITED_BAD_DATA = "\"column 1\",\"column 2 ,\"column3\""; - - //0 = delimiter - //1 = qualifier - private static final String[][] DELIM_QUAL_PAIR = { - {",","\""}, - {"\t","\""}, - {"|","\""}, - {"_","\""}, - {",",null}, - {"|",null}, - {"\t",null}, - }; - + + // 0 = delimiter + // 1 = qualifier + private static final char[][] DELIM_QUAL_PAIR = { { ',', '\"' }, { '\t', '\"' }, { '|', '\"' }, { '_', '\"' }, { ',', 0 }, + { '|', 0 }, { '\t', 0 } }; + /** * Test without any line breaks - * + * */ - public void testNoLineBreaks(){ - //loop down all delimiter qualifier pairs to test - for (int i = 0; i < DELIM_QUAL_PAIR.length; i++){ - final String d = DELIM_QUAL_PAIR[i][0]; - final String q = DELIM_QUAL_PAIR[i][1]; - - final String txtToParse; - if (q == null){ - txtToParse = UnitTestUtils.buildDelimString(DELIMITED_DATA_NO_BREAKS, - d.charAt(0)); - }else{ - txtToParse = UnitTestUtils.buildDelimString(DELIMITED_DATA_NO_BREAKS, - d.charAt(0), - q.charAt(0)); - } - - final List splitLineResults = ParserUtils.splitLine(txtToParse.toString(), - d, q); - - - //check to make sure we have the same amount of elements which were expected - assertEquals("Did Not Get Amount Of Elements Expected (d = " + d + " q = " + q + ")", + public void testNoLineBreaks() { + // loop down all delimiter qualifier pairs to test + for (int i = 0; i < DELIM_QUAL_PAIR.length; i++) { + final char d = DELIM_QUAL_PAIR[i][0]; + final char q = DELIM_QUAL_PAIR[i][1]; + + final String txtToParse = UnitTestUtils.buildDelimString(DELIMITED_DATA_NO_BREAKS, d, q); + + final List splitLineResults = ParserUtils.splitLine(txtToParse, d, q); + + // check to make sure we have the same amount of elements which were + // expected + assertEquals("Did Not Get Amount Of Elements Expected (d = [" + d + "] q = [" + q + "] txt [" + txtToParse + "])", DELIMITED_DATA_NO_BREAKS.length, splitLineResults.size()); - - //loop through each value and compare what came back - for (int j = 0 ; j < DELIMITED_DATA_NO_BREAKS.length; j ++){ - assertEquals("Data Element Value Does Not Match (d = " + d + " q = " + q + ")", - DELIMITED_DATA_NO_BREAKS[j], (String)splitLineResults.get(j)); + + // loop through each value and compare what came back + for (int j = 0; j < DELIMITED_DATA_NO_BREAKS.length; j++) { + assertEquals("Data Element Value Does Not Match (d = [" + d + "] q = [" + q + "] txt [" + txtToParse + "])", + DELIMITED_DATA_NO_BREAKS[j], (String) splitLineResults.get(j)); } } - - + } - + /** * Test without any line breaks - * + * */ - public void testLineBreaks(){ - //loop down all delimiter qualifier pairs to test - for (int i = 0; i < DELIM_QUAL_PAIR.length; i++){ - final String d = DELIM_QUAL_PAIR[i][0]; - final String q = DELIM_QUAL_PAIR[i][1]; - - final String txtToParse; - if (DELIM_QUAL_PAIR[i][1] == null){ - txtToParse = UnitTestUtils.buildDelimString(DELIMITED_DATA_WITH_BREAKS, - DELIM_QUAL_PAIR[i][0].charAt(0)); - }else{ - txtToParse = UnitTestUtils.buildDelimString(DELIMITED_DATA_WITH_BREAKS, - DELIM_QUAL_PAIR[i][0].charAt(0), - DELIM_QUAL_PAIR[i][1].charAt(0)); - } - - final List splitLineResults = ParserUtils.splitLine(txtToParse.toString(), - DELIM_QUAL_PAIR[i][0], DELIM_QUAL_PAIR[i][1]); - - - //check to make sure we have the same amount of elements which were expected + public void testLineBreaks() { + // loop down all delimiter qualifier pairs to test + for (int i = 0; i < DELIM_QUAL_PAIR.length; i++) { + final char d = DELIM_QUAL_PAIR[i][0]; + final char q = DELIM_QUAL_PAIR[i][1]; + + final String txtToParse = UnitTestUtils.buildDelimString(DELIMITED_DATA_WITH_BREAKS, d, q); + + final List splitLineResults = ParserUtils.splitLine(txtToParse.toString(), d, q); + + // check to make sure we have the same amount of elements which were + // expected assertEquals("Did Not Get Amount Of Elements Expected (d = " + d + " q = " + q + ")", DELIMITED_DATA_WITH_BREAKS.length, splitLineResults.size()); - - //loop through each value and compare what came back - for (int j = 0 ; j < DELIMITED_DATA_WITH_BREAKS.length; j ++){ - assertEquals("Data Element Value Does Not Match (d = " + d + " q = " + q + ")", - DELIMITED_DATA_WITH_BREAKS[j], (String)splitLineResults.get(j)); + + // loop through each value and compare what came back + for (int j = 0; j < DELIMITED_DATA_WITH_BREAKS.length; j++) { + assertEquals("Data Element Value Does Not Match (d = " + d + " q = " + q + ")", DELIMITED_DATA_WITH_BREAKS[j], + (String) splitLineResults.get(j)); } - + } } - + /** - * Test to make sure we get the correct amount of elements for malformed data + * Test to make sure we get the correct amount of elements for malformed + * data * * @param args */ - public void testMalformedData(){ - final List splitLineResults = ParserUtils.splitLine(DELIMITED_BAD_DATA, - ",", "\""); - - - assertEquals("Expecting 2 Data Elements From The Malformed Data", - 2, splitLineResults.size()); - + public void testMalformedData() { + final List splitLineResults = ParserUtils.splitLine(DELIMITED_BAD_DATA, ',', '\"'); + + assertEquals("Expecting 2 Data Elements From The Malformed Data", 2, splitLineResults.size()); + } - + public static void main(final String[] args) { junit.textui.TestRunner.run(ParserUtilsSplitLineTest.class); } - + } Modified: trunk/PZFileReader/src/test/java/net/sf/pzfilereader/utilities/UnitTestUtils.java =================================================================== --- trunk/PZFileReader/src/test/java/net/sf/pzfilereader/utilities/UnitTestUtils.java 2006-10-24 21:36:11 UTC (rev 118) +++ trunk/PZFileReader/src/test/java/net/sf/pzfilereader/utilities/UnitTestUtils.java 2006-10-24 23:33:29 UTC (rev 119) @@ -6,46 +6,30 @@ * @author Paul Zepernick */ public class UnitTestUtils { - + /** * Builds a delimited qualified string containing the elements passed in * * @param elements - * Elements To Include In Delimited String + * Elements To Include In Delimited String * @param delimiter * @param qualifier * @return String */ - public static String buildDelimString(final String[] elements, final char delimiter, final char qualifier){ + public static String buildDelimString(final String[] elements, final char delimiter, final char qualifier) { final StringBuffer sb = new StringBuffer(); - for (int i = 0; i < elements.length; i++){ - if (i > 0){ + for (int i = 0; i < elements.length; i++) { + if (i > 0) { sb.append(delimiter); } - sb.append(qualifier).append(elements[i]).append(qualifier); + if (qualifier != 0) { + sb.append(qualifier); + } + sb.append(elements[i]); + if (qualifier != 0) { + sb.append(qualifier); + } } - - return sb.toString(); } - - /** Builds a delimited string containing the elements passed in - * - * @param elements - * Elements To Include In Delimited String - * @param delimiter - * @return String - */ - public static String buildDelimString(final String[] elements, final char delimiter){ - final StringBuffer sb = new StringBuffer(); - for (int i = 0; i < elements.length; i++){ - if (i > 0) { - sb.append(delimiter); - } - sb.append(elements[i]); - } - - - return sb.toString(); - } } Property changes on: trunk/PZFileReaderSamples ___________________________________________________________________ Name: svn:ignore - target + target velocity.log ydocErr.log Modified: trunk/PZFileReaderSamples/qalab.xml =================================================================== --- trunk/PZFileReaderSamples/qalab.xml 2006-10-24 21:36:11 UTC (rev 118) +++ trunk/PZFileReaderSamples/qalab.xml 2006-10-24 23:33:29 UTC (rev 119) @@ -29,6 +29,14 @@ <summaryresult date="2006-10-18" filecount="2" statvalue="2" type="pmd"/> <summaryresult date="2006-10-18" filecount="6" statvalue="8" type="findbugs"/> <summaryresult date="2006-10-18" filecount="6" statvalue="78" type="simian"/> + <summaryresult date="2006-10-20" filecount="34" statvalue="151" type="checkstyle"/> + <summaryresult date="2006-10-20" filecount="2" statvalue="2" type="pmd"/> + <summaryresult date="2006-10-20" filecount="6" statvalue="8" type="findbugs"/> + <summaryresult date="2006-10-20" filecount="6" statvalue="78" type="simian"/> + <summaryresult date="2006-10-25" filecount="34" statvalue="160" type="checkstyle"/> + <summaryresult date="2006-10-25" filecount="2" statvalue="2" type="pmd"/> + <summaryresult date="2006-10-25" filecount="6" statvalue="8" type="findbugs"/> + <summaryresult date="2006-10-25" filecount="6" statvalue="110" type="simian"/> </summary> <file id="com_pz_reader_examples_numericsanddates_package.html" path="com/pz/reader/examples/numericsanddates/package.html"> <result date="2006-10-16" statvalue="1" type="checkstyle"/> @@ -159,83 +167,119 @@ <file id="net_sf_pzfilereader_examples_package.html" path="net/sf/pzfilereader/examples/package.html"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_examples_largedataset_largecsvperformancetest_package.html" path="net/sf/pzfilereader/examples/largedataset/largecsvperformancetest/package.html"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_examples_multilinedelimitedrecord_package.html" path="net/sf/pzfilereader/examples/multilinedelimitedrecord/package.html"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_examples_numericsanddates_package.html" path="net/sf/pzfilereader/examples/numericsanddates/package.html"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_examples_delimitedcolumnnamesinfile_package.html" path="net/sf/pzfilereader/examples/delimitedcolumnnamesinfile/package.html"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_examples_delimiteddynamiccolumns_package.html" path="net/sf/pzfilereader/examples/delimiteddynamiccolumns/package.html"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_examples_exporttoexcel_package.html" path="net/sf/pzfilereader/examples/exporttoexcel/package.html"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_examples_largedataset_fixedlengthdynamiccolumns_package.html" path="net/sf/pzfilereader/examples/largedataset/fixedlengthdynamiccolumns/package.html"> <result date="2006-10-17" statvalue="1" type="checkstyle"/> <result date="2006-10-18" statvalue="1" type="checkstyle"/> + <result date="2006-10-20" statvalue="1" type="checkstyle"/> + <result date="2006-10-25" statvalue="1" type="checkstyle"/> </file> <file id="net_sf_pzfilereader_examples_createsamplecsv_package.html" path="net/sf/pzfilereader/exampl... [truncated message content] |