camel-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Olivier SCHMITT (Updated) (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (CAMEL-4655) Bindy does not support quoted value with separator char in CSV datasource
Date Thu, 10 Nov 2011 07:36:51 GMT

     [ https://issues.apache.org/jira/browse/CAMEL-4655?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Olivier SCHMITT updated CAMEL-4655:
-----------------------------------

    Description: 
i'm currently writing a tuto on Camel (2.8.2).

Showing HTTP4 component usage by downloading US Gov public data, i found a problem :


                from("quartz://dataTimer?cron=0+*+*+*+*+?").to("direct:datas");

                from("direct:datas")
                .to("http4://earthquake.usgs.gov/earthquakes/catalogs/eqs7day-M1.txt")
                .unmarshal(new BindyCsvDataFormat("net.thejeearchitectcookbook.camel.earthquake"))
                .process(new Processor() {

                        public void process(Exchange exchange) throws Exception {

                                Message message = exchange.getIn();

                                // ...
                        }
                });

The data format is like and my separator char is ",":

nc,71678421,0,"Wednesday, November  9, 2011 14:53:13 UTC",37.5727,-118.8170,1.3,6.60,14,"Central
California"

I want to get all datas as java.lang.String but the date value raises exception :

java.lang.IllegalArgumentException: No position 11 defined for the field: 14, line: 2 must
be specified]

My separator is "," but some values are nested inside " ". Unfortunately there are "," inside
the " ".

Bindy get lost !
 
How can i get String values nested inside " " and containing "," ?

I can note that Camel CSV component deals with it without any problems.


Here is my pojo :


package net.thejeearchitectcookbook.camel.earthquake;

import java.io.Serializable;


import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
import org.apache.camel.dataformat.bindy.annotation.DataField;


@CsvRecord( separator = ",")
public class EarthquakeInfos implements Serializable {
   
        @DataField(pos = 1)
    private String src;
       
        @DataField(pos = 2)
    private String eqid;
       
        @DataField(pos = 3)
    private String version;
       
    @DataField(pos = 4)
    private String datetime;
   
        @DataField(pos = 5)
    private String lat;
       
        @DataField(pos = 6)
    private String lon;
   
    @DataField(pos = 7)
    private String magnitude;
   
        @DataField(pos = 8)
    private String depth;
       
        @DataField(pos = 9)
    private String nst;
       
    @DataField(pos = 10)
    private String place;
   



    public String getSrc() {
                return src;
        }

        public void setSrc(String src) {
                this.src = src;
        }

        public String getEqid() {
                return eqid;
        }

        public void setEqid(String eqid) {
                this.eqid = eqid;
        }

        public String getVersion() {
                return version;
        }

        public void setVersion(String version) {
                this.version = version;
        }

        public String getLat() {
                return lat;
        }

        public void setLat(String lat) {
                this.lat = lat;
        }

        public String getLon() {
                return lon;
        }

        public void setLon(String lon) {
                this.lon = lon;
        }

        public String getDepth() {
                return depth;
        }

        public void setDepth(String depth) {
                this.depth = depth;
        }

        public String getNst() {
                return nst;
        }

        public void setNst(String nst) {
                this.nst = nst;
        }

        public String getDatetime() {
        return datetime;
    }

    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }

    public String getMagnitude() {
        return magnitude;
    }

    public void setMagnitude(String magnitude) {
        this.magnitude = magnitude;
    }

    public String getPlace() {
        return place;
    }

    public void setPlace(String place) {
        this.place = place;
    }
} 

I can find that CSV Camel component performs well with the same datasource :

from("direct:datas")
.to("http4://earthquake.usgs.gov/earthquakes/catalogs/eqs7day-M1.txt")
.unmarshal().csv().process(new Processor() {

	public void process(Exchange exchange) throws Exception {

		Message message = exchange.getIn();
		List<List<String>> datas = (List<List<String>>) message.getBody();
		// Skip header
		datas = datas.subList(1, datas.size() - 1);
		// Process my data
		for (List<String> row : datas) {
			// Process Row
			String datetime = row.get(3);
			String region = row.get(9);
			String magnitude = row.get(6);
					
		}
	}
});


  was:
i'm currently writing a tuto on Camel (2.8.2).

Showing HTTP4 component usage by downloading US Gov public data, i found a problem :


                from("quartz://dataTimer?cron=0+*+*+*+*+?").to("direct:datas");

                from("direct:datas")
                .to("http4://earthquake.usgs.gov/earthquakes/catalogs/eqs7day-M1.txt")
                .unmarshal(new BindyCsvDataFormat("net.thejeearchitectcookbook.camel.earthquake"))
                .process(new Processor() {

                        public void process(Exchange exchange) throws Exception {

                                Message message = exchange.getIn();

                                // ...
                        }
                });

The data format is like :

nc,71678421,0,"Wednesday, November  9, 2011 14:53:13 UTC",37.5727,-118.8170,1.3,6.60,14,"Central
California"

I want to get all datas as java.lang.String but the date value raises exception :

java.lang.IllegalArgumentException: No position 11 defined for the field: 14, line: 2 must
be specified]

My separator is "," but some values are nested inside " ". Unfortunately there are , inside
the " ".

Bindy get lost !
 
How can i get String values nested inside " " and containing "," ?

I can note that Camel CSV component deals with it without any problems.


Here is my pojo :


package net.thejeearchitectcookbook.camel.earthquake;

import java.io.Serializable;


import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
import org.apache.camel.dataformat.bindy.annotation.DataField;


@CsvRecord( separator = ",")
public class EarthquakeInfos implements Serializable {
   
        @DataField(pos = 1)
    private String src;
       
        @DataField(pos = 2)
    private String eqid;
       
        @DataField(pos = 3)
    private String version;
       
    @DataField(pos = 4)
    private String datetime;
   
        @DataField(pos = 5)
    private String lat;
       
        @DataField(pos = 6)
    private String lon;
   
    @DataField(pos = 7)
    private String magnitude;
   
        @DataField(pos = 8)
    private String depth;
       
        @DataField(pos = 9)
    private String nst;
       
    @DataField(pos = 10)
    private String place;
   



    public String getSrc() {
                return src;
        }

        public void setSrc(String src) {
                this.src = src;
        }

        public String getEqid() {
                return eqid;
        }

        public void setEqid(String eqid) {
                this.eqid = eqid;
        }

        public String getVersion() {
                return version;
        }

        public void setVersion(String version) {
                this.version = version;
        }

        public String getLat() {
                return lat;
        }

        public void setLat(String lat) {
                this.lat = lat;
        }

        public String getLon() {
                return lon;
        }

        public void setLon(String lon) {
                this.lon = lon;
        }

        public String getDepth() {
                return depth;
        }

        public void setDepth(String depth) {
                this.depth = depth;
        }

        public String getNst() {
                return nst;
        }

        public void setNst(String nst) {
                this.nst = nst;
        }

        public String getDatetime() {
        return datetime;
    }

    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }

    public String getMagnitude() {
        return magnitude;
    }

    public void setMagnitude(String magnitude) {
        this.magnitude = magnitude;
    }

    public String getPlace() {
        return place;
    }

    public void setPlace(String place) {
        this.place = place;
    }
} 

I can find that CSV Camel component performs well with the same datasource :

from("direct:datas")
.to("http4://earthquake.usgs.gov/earthquakes/catalogs/eqs7day-M1.txt")
.unmarshal().csv().process(new Processor() {

	public void process(Exchange exchange) throws Exception {

		Message message = exchange.getIn();
		List<List<String>> datas = (List<List<String>>) message.getBody();
		// Skip header
		datas = datas.subList(1, datas.size() - 1);
		// Process my data
		for (List<String> row : datas) {
			// Process Row
			String datetime = row.get(3);
			String region = row.get(9);
			String magnitude = row.get(6);
					
		}
	}
});


    
> Bindy does not support quoted value with separator char in CSV datasource
> -------------------------------------------------------------------------
>
>                 Key: CAMEL-4655
>                 URL: https://issues.apache.org/jira/browse/CAMEL-4655
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-bindy
>    Affects Versions: 2.8.2
>         Environment: Mac Snow Leopard
> Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425)
> Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)
> Maven 3.0.1
>            Reporter: Olivier SCHMITT
>
> i'm currently writing a tuto on Camel (2.8.2).
> Showing HTTP4 component usage by downloading US Gov public data, i found a problem :
>                 from("quartz://dataTimer?cron=0+*+*+*+*+?").to("direct:datas");
>                 from("direct:datas")
>                 .to("http4://earthquake.usgs.gov/earthquakes/catalogs/eqs7day-M1.txt")
>                 .unmarshal(new BindyCsvDataFormat("net.thejeearchitectcookbook.camel.earthquake"))
>                 .process(new Processor() {
>                         public void process(Exchange exchange) throws Exception {
>                                 Message message = exchange.getIn();
>                                 // ...
>                         }
>                 });
> The data format is like and my separator char is ",":
> nc,71678421,0,"Wednesday, November  9, 2011 14:53:13 UTC",37.5727,-118.8170,1.3,6.60,14,"Central
California"
> I want to get all datas as java.lang.String but the date value raises exception :
> java.lang.IllegalArgumentException: No position 11 defined for the field: 14, line: 2
must be specified]
> My separator is "," but some values are nested inside " ". Unfortunately there are ","
inside the " ".
> Bindy get lost !
>  
> How can i get String values nested inside " " and containing "," ?
> I can note that Camel CSV component deals with it without any problems.
> Here is my pojo :
> package net.thejeearchitectcookbook.camel.earthquake;
> import java.io.Serializable;
> import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
> import org.apache.camel.dataformat.bindy.annotation.DataField;
> @CsvRecord( separator = ",")
> public class EarthquakeInfos implements Serializable {
>    
>         @DataField(pos = 1)
>     private String src;
>        
>         @DataField(pos = 2)
>     private String eqid;
>        
>         @DataField(pos = 3)
>     private String version;
>        
>     @DataField(pos = 4)
>     private String datetime;
>    
>         @DataField(pos = 5)
>     private String lat;
>        
>         @DataField(pos = 6)
>     private String lon;
>    
>     @DataField(pos = 7)
>     private String magnitude;
>    
>         @DataField(pos = 8)
>     private String depth;
>        
>         @DataField(pos = 9)
>     private String nst;
>        
>     @DataField(pos = 10)
>     private String place;
>    
>     public String getSrc() {
>                 return src;
>         }
>         public void setSrc(String src) {
>                 this.src = src;
>         }
>         public String getEqid() {
>                 return eqid;
>         }
>         public void setEqid(String eqid) {
>                 this.eqid = eqid;
>         }
>         public String getVersion() {
>                 return version;
>         }
>         public void setVersion(String version) {
>                 this.version = version;
>         }
>         public String getLat() {
>                 return lat;
>         }
>         public void setLat(String lat) {
>                 this.lat = lat;
>         }
>         public String getLon() {
>                 return lon;
>         }
>         public void setLon(String lon) {
>                 this.lon = lon;
>         }
>         public String getDepth() {
>                 return depth;
>         }
>         public void setDepth(String depth) {
>                 this.depth = depth;
>         }
>         public String getNst() {
>                 return nst;
>         }
>         public void setNst(String nst) {
>                 this.nst = nst;
>         }
>         public String getDatetime() {
>         return datetime;
>     }
>     public void setDatetime(String datetime) {
>         this.datetime = datetime;
>     }
>     public String getMagnitude() {
>         return magnitude;
>     }
>     public void setMagnitude(String magnitude) {
>         this.magnitude = magnitude;
>     }
>     public String getPlace() {
>         return place;
>     }
>     public void setPlace(String place) {
>         this.place = place;
>     }
> } 
> I can find that CSV Camel component performs well with the same datasource :
> from("direct:datas")
> .to("http4://earthquake.usgs.gov/earthquakes/catalogs/eqs7day-M1.txt")
> .unmarshal().csv().process(new Processor() {
> 	public void process(Exchange exchange) throws Exception {
> 		Message message = exchange.getIn();
> 		List<List<String>> datas = (List<List<String>>) message.getBody();
> 		// Skip header
> 		datas = datas.subList(1, datas.size() - 1);
> 		// Process my data
> 		for (List<String> row : datas) {
> 			// Process Row
> 			String datetime = row.get(3);
> 			String region = row.get(9);
> 			String magnitude = row.get(6);
> 					
> 		}
> 	}
> });

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message