Changeset 2638


Ignore:
Timestamp:
02/12/10 13:25:24 (2 years ago)
Author:
jvelde
Message:

Fixed a bug that caused copies of values in empty slots because of a split that returns a smaller array in case of empty values, causing values to be left behind that should be overwritten with nulls.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • molgenis/3.3/src/org/molgenis/util/CsvBufferedReader.java

    r2625 r2638  
    191191        } 
    192192 
    193         public List<Object> getForHeader(String header){ 
    194                 //TODO: very simple function, just return a single column in the form of a list by a header name 
     193        public List<Object> getForHeader(String header) 
     194        { 
     195                // TODO: very simple function, just return a single column in the form 
     196                // of a list by a header name 
    195197                return null; 
    196198        } 
    197          
    198         public int parse(int noElements,  CsvReaderListener... listeners) throws Exception 
     199 
     200        public int parse(int noElements, CsvReaderListener... listeners) throws Exception 
    199201        { 
    200202                return this.parse(noElements, null, listeners); 
    201203        } 
    202          
     204 
    203205        // @Override 
    204206        public int parse(int noElements, List<Integer> rows, CsvReaderListener... listeners) throws Exception 
    205         {                
     207        { 
    206208                List<String> headers = null; 
    207209                if (hasHeader) headers = colnames(); 
     
    234236                int lineCount = 0; 
    235237                // int index; 
    236                  
     238 
    237239                // template of the tuple 
    238240                Tuple t; 
    239                 if (hasHeader) t = new SimpleTuple(headers);  
    240                 else t = new SimpleTuple(); 
    241                  
     241                if (hasHeader) t = new SimpleTuple(headers); 
     242                else 
     243                        t = new SimpleTuple(); 
     244 
    242245                while (lineCount < noElements && (line = reader.readLine()) != null && !isBlockEnd(line)) 
    243246                { 
     
    249252                                logger.warn("found empty line: " + lineCount); 
    250253                        } 
    251                         else if(rows == null || rows.contains(lineCount)) 
     254                        else if (rows == null || rows.contains(lineCount)) 
    252255                        { 
    253256 
     
    276279                                } 
    277280 
     281                                // FIX: 
     282                                // if the last character is empty; split does not return the 
     283                                // last character, values[] is one character too short; then 
     284                                // missing character is not overwritten with null, causing wrong 
     285                                // values in subsequent last columns: previous values are 
     286                                // copied into empty next ones until a new non-empty one 
     287                                if (values.length == headers.size() - 1) 
     288                                { 
     289                                        String[] valuesNew = new String[values.length + 1]; 
     290                                        for (int i = 0; i < values.length; i++) 
     291                                        { 
     292                                                valuesNew[i] = values[i]; 
     293                                        } 
     294                                        valuesNew[values.length] = null; 
     295                                        values = valuesNew; 
     296                                } 
     297 
    278298                                t.set(values); 
    279                                 // logger.debug("found: " + t.toString()); 
     299                                // logger.info("found: " + t.toString()); 
    280300 
    281301                                // handle the tuple by all handlers 
     
    294314                                                catch (Exception e) 
    295315                                                { 
    296                                                         //e.printStackTrace(); 
     316                                                        // e.printStackTrace(); 
    297317                                                        logger.error("parsing of row " + lineCount + " failed: " + e); 
    298318                                                        throw new Exception("parse error on line " + lineCount + ": " + e.getMessage()); 
     
    311331                return this.parse(Integer.MAX_VALUE, listeners); 
    312332        } 
    313          
     333 
    314334        @Override 
    315335        public int parse(List<Integer> rows, CsvReaderListener... listeners) throws Exception 
     
    333353         */ 
    334354        private String[] split(String string, char separator) 
    335         {        
     355        { 
    336356                // FIXME: need to trim esp if there are spaces leading up to a \" 
    337357                char escape = '"'; 
Note: See TracChangeset for help on using the changeset viewer.