Repository: frictionlessdata/tabulator-py
Pull request #131 (2016-11-08 08:52:24)

Fixed csv doublequote detection
- related issue https://github.com/openspending/openspending/issues/1151

---

Builtin csv sniffer acts weird setting `doublequote` to False even if there is no `escapechar`. 

roll: @akariv 
please take a look - in Uruguay data problem with cells 72-74, K
akariv: LGTM @roll , Thanks!

roll: Thanks!

Patch:
diff --git a/data/special/doublequote.csv b/data/special/doublequote.csv
new file mode 100644
index 0000000..71598d0
--- /dev/null
+++ b/data/special/doublequote.csv
@@ -0,0 +1,6 @@
+"INCISO","NOMBREINCISO","UE","NOMBREUE","AÑO","CODIGOAP","NOMBREAP","DESCRIPCIONAP","CODIGOPROGRAMA","NOMBREPROGRAMA","DESCRIPCIONPROGRAMA","INCISOCODIGO","UECODIGO","ue_cod","presupuestado","pfi","pbi"
+"A.N.E.P.","Administración Nacional de Educación Pública","CES","Consejo de Educación Secundaria",2019,8,"EDUCACIÓN","Comprende los servicios prestados a alumnos y estudiantes, y los servicios docentes; la formulación y administración de políticas educativas, aplicación de normas, regulación, autorización y supervisión de los centros de enseñanza, así como la investigación aplicada y el desarrollo experimental en relación con los asuntos y servicios docentes; los gastos relacionados con la administración y gestión de centros educativos que imparten educación preescolar, primaria, secundaria y universitaria, así como otras instituciones que brindan formación y capacitación. Comprende la prestación de servicios auxiliares de la educación, como transporte, seguridad, alimentación, alojamiento, atención médica y odontológica y otros servicios auxiliares conexos. Comprende además las escuelas y academias militares, las escuelas de policía que imparten enseñanza general y la formación para el servicio exterior.",608,"Inversiones edilicias y equipamiento"," ",25,3,25003,74350819,"Inversión",".003465"
+"A.N.E.P.","Administración Nacional de Educación Pública","CFed","Consejo de Formación en Educación",2015,8,"EDUCACIÓN","Comprende los servicios prestados a alumnos y estudiantes, y los servicios docentes; la formulación y administración de políticas educativas, aplicación de normas, regulación, autorización y supervisión de los centros de enseñanza, así como la investigación aplicada y el desarrollo experimental en relación con los asuntos y servicios docentes; los gastos relacionados con la administración y gestión de centros educativos que imparten educación preescolar, primaria, secundaria y universitaria, así como otras instituciones que brindan formación y capacitación. Comprende la prestación de servicios auxiliares de la educación, como transporte, seguridad, alimentación, alojamiento, atención médica y odontológica y otros servicios auxiliares conexos. Comprende además las escuelas y academias militares, las escuelas de policía que imparten enseñanza general y la formación para el servicio exterior.",5,"Formación en Educación","Formación de profesionales de la educación, incluyendo la formación de educadores sociales. La Ley General de Educación Nº 18.43, en su artículo nro. 31 define la formación en educación. Ésta... '""se concebirá como enseñanza terciaria universitaria y abarcará la formación de maestros, maestros técnicos, profesores, profesores de educación física y educadores sociales, así como de otras formaciones que el Sistema Nacional de Educación requiera'"".",25,5,25005,117396841,"Funcionamiento",".007937"
+"A.N.E.P.","Administración Nacional de Educación Pública","CFed","Consejo de Formación en Educación",2015,8,"EDUCACIÓN","Comprende los servicios prestados a alumnos y estudiantes, y los servicios docentes; la formulación y administración de políticas educativas, aplicación de normas, regulación, autorización y supervisión de los centros de enseñanza, así como la investigación aplicada y el desarrollo experimental en relación con los asuntos y servicios docentes; los gastos relacionados con la administración y gestión de centros educativos que imparten educación preescolar, primaria, secundaria y universitaria, así como otras instituciones que brindan formación y capacitación. Comprende la prestación de servicios auxiliares de la educación, como transporte, seguridad, alimentación, alojamiento, atención médica y odontológica y otros servicios auxiliares conexos. Comprende además las escuelas y academias militares, las escuelas de policía que imparten enseñanza general y la formación para el servicio exterior.",5,"Formación en Educación","Formación de profesionales de la educación, incluyendo la formación de educadores sociales. La Ley General de Educación Nº 18.43, en su artículo nro. 31 define la formación en educación. Ésta... '""se concebirá como enseñanza terciaria universitaria y abarcará la formación de maestros, maestros técnicos, profesores, profesores de educación física y educadores sociales, así como de otras formaciones que el Sistema Nacional de Educación requiera'"".",25,5,25005,38107510,"Inversión",".002576"
+"A.N.E.P.","Administración Nacional de Educación Pública","CFed","Consejo de Formación en Educación",2015,8,"EDUCACIÓN","Comprende los servicios prestados a alumnos y estudiantes, y los servicios docentes; la formulación y administración de políticas educativas, aplicación de normas, regulación, autorización y supervisión de los centros de enseñanza, así como la investigación aplicada y el desarrollo experimental en relación con los asuntos y servicios docentes; los gastos relacionados con la administración y gestión de centros educativos que imparten educación preescolar, primaria, secundaria y universitaria, así como otras instituciones que brindan formación y capacitación. Comprende la prestación de servicios auxiliares de la educación, como transporte, seguridad, alimentación, alojamiento, atención médica y odontológica y otros servicios auxiliares conexos. Comprende además las escuelas y academias militares, las escuelas de policía que imparten enseñanza general y la formación para el servicio exterior.",5,"Formación en Educación","Formación de profesionales de la educación, incluyendo la formación de educadores sociales. La Ley General de Educación Nº 18.43, en su artículo nro. 31 define la formación en educación. Ésta... '""se concebirá como enseñanza terciaria universitaria y abarcará la formación de maestros, maestros técnicos, profesores, profesores de educación física y educadores sociales, así como de otras formaciones que el Sistema Nacional de Educación requiera'"".",25,5,25005,1616869527,"Personal",".109327"
+"A.N.E.P.","Administración Nacional de Educación Pública","CFed","Consejo de Formación en Educación",2016,8,"EDUCACIÓN","Comprende los servicios prestados a alumnos y estudiantes, y los servicios docentes; la formulación y administración de políticas educativas, aplicación de normas, regulación, autorización y supervisión de los centros de enseñanza, así como la investigación aplicada y el desarrollo experimental en relación con los asuntos y servicios docentes; los gastos relacionados con la administración y gestión de centros educativos que imparten educación preescolar, primaria, secundaria y universitaria, así como otras instituciones que brindan formación y capacitación. Comprende la prestación de servicios auxiliares de la educación, como transporte, seguridad, alimentación, alojamiento, atención médica y odontológica y otros servicios auxiliares conexos. Comprende además las escuelas y academias militares, las escuelas de policía que imparten enseñanza general y la formación para el servicio exterior.",601,"Administración de la Educación y Gestión de Políticas Transversales"," ",25,5,25005,25856879,"Funcionamiento",".001586"
diff --git a/tabulator/parsers/csv.py b/tabulator/parsers/csv.py
index 2c63e3d..ef20a05 100644
--- a/tabulator/parsers/csv.py
+++ b/tabulator/parsers/csv.py
@@ -107,6 +107,8 @@ class CSVParser(api.Parser):
             separator = b'' if six.PY2 else ''
             delimiter = self.__options.get('delimiter', ',')
             dialect = csv.Sniffer().sniff(separator.join(sample), delimiter)
+            if not dialect.escapechar:
+                dialect.doublequote = True
         except csv.Error:
             dialect = csv.excel
         for key, value in self.__options.items():


Test patch:
diff --git a/tests/test_stream.py b/tests/test_stream.py
index a5b379e..501fc37 100644
--- a/tests/test_stream.py
+++ b/tests/test_stream.py
@@ -38,6 +38,12 @@ def test_stream_csv_escaping():
         ]
 
 
+def test_stream_csv_doublequote():
+    with Stream('data/special/doublequote.csv') as stream:
+        for row in  stream:
+            assert len(row) == 17
+
+
 # Tests [options]
 
 def test_stream_csv_delimiter():