Index: /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseConstants.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseConstants.java	(revision 29652)
+++ /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseConstants.java	(revision 29653)
@@ -59,4 +59,5 @@
     public static final DataSetCategory CAT_ENVIRONNEMENT = new DataSetCategory("Environnement", "");
     public static final DataSetCategory CAT_PATRIMOINE = new DataSetCategory("Patrimoine", "");
+    public static final DataSetCategory CAT_SERVICES = new DataSetCategory("Services", "");
     public static final DataSetCategory CAT_SPORT = new DataSetCategory("Sport", "");
     public static final DataSetCategory CAT_TOPOGRAPHIE = new DataSetCategory("Topographie", "");
Index: /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java	(revision 29652)
+++ /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/ToulouseModule.java	(revision 29653)
@@ -51,4 +51,5 @@
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.patrimoine.Parcelles1680Handler;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.patrimoine.Parcelles1830Handler;
+import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.services.MarchesPleinVentHandler;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.sport.InstallationSportiveBalmaHandler;
 import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.sport.InstallationSportiveToulouseHandler;
@@ -114,4 +115,5 @@
         handlers.add(InstallationSportiveToulouseHandler.class);
         handlers.add(StationsAutoPartageHandler.class);
+        handlers.add(MarchesPleinVentHandler.class);
     }
     
Index: /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/services/MarchesPleinVentHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/services/MarchesPleinVentHandler.java	(revision 29653)
+++ /applications/editors/josm/plugins/opendata/modules/fr.toulouse/src/org/openstreetmap/josm/plugins/opendata/modules/fr/toulouse/datasets/services/MarchesPleinVentHandler.java	(revision 29653)
@@ -0,0 +1,75 @@
+//    JOSM opendata plugin.
+//    Copyright (C) 2011-2013 Don-vip
+//
+//    This program is free software: you can redistribute it and/or modify
+//    it under the terms of the GNU General Public License as published by
+//    the Free Software Foundation, either version 3 of the License, or
+//    (at your option) any later version.
+//
+//    This program is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//    GNU General Public License for more details.
+//
+//    You should have received a copy of the GNU General Public License
+//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+package org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.services;
+
+import org.apache.commons.lang3.text.WordUtils;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.ToulouseDataSetHandler;
+
+public class MarchesPleinVentHandler extends ToulouseDataSetHandler {
+
+    public MarchesPleinVentHandler() {
+        super(19640, "amenity=marketplace");
+        setName("Marchés de plein vent");
+        setCategory(CAT_SERVICES);
+        setSingleProjection(wgs84);
+    }
+
+    @Override
+    public boolean acceptsFilename(String filename) {
+        return acceptsOdsFilename(filename, "MPVToulouse_OpenData");
+    }
+
+    @Override
+    public void updateDataSet(DataSet ds) {
+        for (Node n : ds.getNodes()) {
+            n.remove("Adresse");
+            n.remove("Code Postal");
+            replace(n, "Nom", "name", new ValueReplacer() {
+                @Override public String replace(String value) {
+                    return WordUtils.capitalizeFully(value).replace(", ", "").replace("MarchÉ", "Marché");
+                }});
+            n.put("amenity", "marketplace");
+            replace(n, "Type", "note");
+            String hours = "";
+            for (String[] day : new String[][]{
+                    new String[]{"Lundi","Mo"},
+                    new String[]{"mardi","Tu"},
+                    new String[]{"mercredi","We"},
+                    new String[]{"jeudi","Th"},
+                    new String[]{"vendredi","Fr"},
+                    new String[]{"samedi","Sa"},
+                    new String[]{"dimanche","Su"}
+            }) {
+                String value = n.get(day[0]);
+                if (value != null) {
+                    if (!hours.isEmpty()) {
+                        hours += "; ";
+                    }
+                    hours += day[1]+" "+value.replace(" ", "").replace('–','-').replace('h', ':').replace(":-", ":00-");
+                    if (hours.endsWith(":")) {
+                        hours += "00";
+                    }
+                    n.remove(day[0]);
+                }
+            }
+            if (!hours.isEmpty()) {
+                n.put("opening_hours", hours);
+            }
+        }
+    }
+}
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 29652)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 29653)
@@ -129,6 +129,6 @@
      * Coordinates fields
      */
-    public static final String X_STRING = "X|LON|LONGI|LONGITUDE.*|EASTING";
-    public static final String Y_STRING = "Y|LAT|LATI|LATITUDE.*|NORTHING";
+    public static final String X_STRING = "X|LON|LONGI|.*LONGITUDE.*|EASTING";
+    public static final String Y_STRING = "Y|LAT|LATI|.*LATITUDE.*|NORTHING";
     
     // The list of all ProjectionPatterns (filled at each constructor call)
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 29652)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 29653)
@@ -183,32 +183,33 @@
 			}
 			
-			for (int i = 0; i<fields.length; i++) {
+			if (fields.length > header.length) {
+			    Main.warn(tr("Invalid file. Bad length on line {0}. Expected {1} columns, got {2}.", lineNumber, header.length, fields.length));
+			    Main.warn(Arrays.toString(fields));
+			}
+			
+			for (int i = 0; i<Math.min(fields.length, header.length); i++) {
 				try {
-					if (i >= header.length) {
-						throw new IllegalArgumentException(tr("Invalid file. Bad length on line {0}. Expected {1} columns, got {2}.", lineNumber, header.length, i+1));
-					} else {
-					    boolean coordinate = false;
-					    for (CoordinateColumns c : columns) {
-					        EastNorth en = ens.get(c);
-	                        if (i == c.xCol) {
-	                            coordinate = true;
-	                            en.setLocation(parseDouble(fields[i]), en.north());
-	                            if (handler != null) {
-	                                handler.setXCol(i);
-	                            }
-	                        } else if (i == c.yCol) {
-                                coordinate = true;
-	                            en.setLocation(en.east(), parseDouble(fields[i]));
-	                            if (handler != null) {
-	                                handler.setYCol(i);
-	                            }
-	                        }					        
-					    }
-	                    if (!coordinate) {
-	                        if (!fields[i].isEmpty()) {
-	                            nodes.values().iterator().next().put(header[i], fields[i]);
-	                        }
-	                    }
-					}
+				    boolean coordinate = false;
+				    for (CoordinateColumns c : columns) {
+				        EastNorth en = ens.get(c);
+                        if (i == c.xCol) {
+                            coordinate = true;
+                            en.setLocation(parseDouble(fields[i]), en.north());
+                            if (handler != null) {
+                                handler.setXCol(i);
+                            }
+                        } else if (i == c.yCol) {
+                            coordinate = true;
+                            en.setLocation(en.east(), parseDouble(fields[i]));
+                            if (handler != null) {
+                                handler.setYCol(i);
+                            }
+                        }					        
+				    }
+                    if (!coordinate) {
+                        if (!fields[i].isEmpty()) {
+                            nodes.values().iterator().next().put(header[i], fields[i]);
+                        }
+                    }
 				} catch (ParseException e) {
 					System.err.println("Warning: Parsing error on line "+lineNumber+": "+e.getMessage());
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java	(revision 29652)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/modules/AbstractModule.java	(revision 29653)
@@ -134,5 +134,5 @@
 					result.add(handlerClass.newInstance());
 				} catch (Throwable t) {
-					System.err.println(t.getClass().getName()+": "+t.getMessage());
+					System.err.println("Cannot instantiate "+handlerClass+" because of "+t.getClass().getName()+": "+t.getMessage());
 				}
 			}
