Referencia del Archivo CSV.h

getNextCSV() y setQuotedCSV(): Librería para procesar archivos CSV. Más...

#include <string>
#include <iostream>
#include <vector>
#include <stdlib.h>

Ir al código fuente de este archivo.

Definiciones

#define Spanish_dox   "Documentación en español"
 Documentación en español.

Funciones

void setQuotedCSV (std::string &res, const std::string &value)
 Prepara value para ser grabado en un archivo CSV.
bool getNextCSV (std::string &csv, std::istream &CIN)
 Obtiene del flujo de entrada CIN el siguiente valor CSV.
void trim (std::string &str)
 Le elimina a "str" los blancos del principio y del final.
void trimCSV (std::string &str)
 Convierte un campo CSV incorrecto en su probable valor correcto.
void chop (std::string &str, char ch=0)
 Elimina ch si es el último caracter de str.


Descripción detallada

getNextCSV() y setQuotedCSV(): Librería para procesar archivos CSV.

CSV: (Comma Separated Value). El formato CSV ha sido definido por IETF with RFC-4180.

Ver también:
http://tools.ietf.org/html/rfc4180
Se incluyen 2 rutines principales para procesar archivos CSV:
  • Para obtener valores use la función getNextCSV().
  • Para almacenar alores use la función void setQuotedCSV() y luego almacene la hilera resultante.
La clase CSV_line es un empaque C++ para estas rutinas, pero requiere que no haya caracteres de fin de línea ( Line Feed "\n" ) en los renglones del archivo CSV.

Autor:
Adolfo Di Mare <adolfo@di-mare.com>
Fecha:
2008

Definición en el archivo CSV.h.


Documentación de las definiciones

#define Spanish_dox   "Documentación en español"

Documentación en español.

Definición en la línea 10 del archivo CSV.h.


Documentación de las funciones

void setQuotedCSV ( std::string &  res,
const std::string &  value 
)

Prepara value para ser grabado en un archivo CSV.

  • Almacena un valor nuevo en la hilera res.
  • Rodea el resultado de comillas dobles cuando value tiene espacios en blanco (whitespace).
  • Rodea el resultado de comillas dobles cuando value tiene comillas dobles.
  • Rodea el resultado de comillas dobles cuando value tiene comas ",".
  • Sustitutye cada comilla doble '"' dentro de value por 2 comillas dobles [""].
  • Trabaja con char; no ha sido probada con wchar_t.

    {{  // test::setQuotedCSV()
        std::string res;
        setQuotedCSV( res, ","    );  assertTrue( res == "\",\"" );     // [","]
        setQuotedCSV( res, "2"    );  assertTrue( res == "2" );         // [2]
        setQuotedCSV( res, ""     );  assertTrue( res == "" );          // []
        setQuotedCSV( res, "4,5"  );  assertTrue( res == "\"4,5\"" );   // ["4,5"]
        setQuotedCSV( res, "K\""  );  assertTrue( res == "\"K\"\"\"" ); // ["K"""]
        setQuotedCSV( res, "\r\n" );  assertTrue( res == "\"\r\n\"" );  // ["\r\n"]
    }}
Ver también:
test_CSV::setQuotedCSV()

Definición en la línea 212 del archivo CSV.cpp.

bool getNextCSV ( std::string &  csv,
std::istream &  CIN 
)

Obtiene del flujo de entrada CIN el siguiente valor CSV.

  • CIN debiera estar abierto en modo std::ios::binary pues los caracteres son extraídos uno por uno, usando CIN.get(ch).
  • El valor obtenido de CIN queda almacenado en csv.
  • Trabaja bien con char, no ha sido probado para wchar_t.
  • Elimina de csv los caracteres finales (CR+LF or LF) ==> "\r\n" o "\n".
  • En lo posible se ha tratado de cumplir con el RFC-4180.

Devuelve:
true cuando el campo CSV termina en "\n" (LF -> LineFeed).
Ver también:
http://tools.ietf.org/html/rfc4180

http://www.horstmann.com/cpp/pitfalls.html

{{  // test::getNextCSV()
    VEC.clear();          // std::vector<std::string> VEC;
    std::string csv;
    bool eol_CIN = false; // stop when the end of line is reached
    std::istringstream ist( str , std::ios::binary );
    while ( ! eol_CIN && ! ist.fail() ) { // ! ist.eof() pitfall!
        eol_CIN = getNextCSV( csv, ist );
        VEC.push_back( csv );
    }
    return;
    //  Using std::ios::binary ensures that no CR+LF chars are discarded
}}
Ver también:
test_CSV::getNextCSV()

Definición en la línea 170 del archivo CSV.cpp.

void trim ( std::string &  str  ) 

Le elimina a "str" los blancos del principio y del final.

  • También elimina los caracteres " \f\n\r\t\v".
  • Usa isspace(ch) para determinar si una letra es o no es algún tipo de espacio whitespace.

    {{  // test::trim()
        std::string str;
        str = " a b   "; trim(str); assertTrue( str == "a b"  );
        str = "  a\nb "; trim(str); assertTrue( str == "a\nb" );
        str = "";        trim(str); assertTrue( str == ""     );
        str = "\r\t\n "; trim(str); assertTrue( str == ""     );
        str = " a b ";   trim(str); assertTrue( str == "a b"  );
        str = " ab " ;   trim(str); assertTrue( str == "ab"   );
    }}
Ver también:
test_CSV::test_trim()

Definición en la línea 232 del archivo CSV.cpp.

void trimCSV ( std::string &  str  ) 

Convierte un campo CSV incorrecto en su probable valor correcto.

  • Le elimina a "str" los blancos y comillas del principio y del final usando trim().
  • Si después de eliminar los espacios en blanco "str" comienza y termina con comillas, sustituye cada pareja de comillas dobles [""] por una sóla comilla simple ["].
  • No verifica que todas las comillas dobles estén correctamente emparejadas.

En algunas ocasiones un archivo.csv tiene campos entre comillas que están precedidos por espacios en blanco. Esos campos CSV no cumplen con los requisitos definidos en la especificación RFC-4180 por lo que son extraídos por getNextCSV() tal cual vienen, sin eliminar los espacios y sin sustituir las parejas de comillas dobles por comillas simples, como se muestra en el siguiente ejemplo en que los paréntesis cuadrados se usan en lugar de la comilla ["] para hacerlo más legible:

        ["zero",  "if "" 1" , , " 3xt"  \r\n]
        [....0.,........ 1..,2,.........3...]

         csv field        getNextCSV()    trimCSV()
    +------------------+----------------+----------+
    | ["zero"]         | [zero]         | [zero]   |
    | [,  "if "" 1" ]  | [  "if "" 1" ] | [if " 1] |
    | [, ]             | [ ]            | []       |
    | [, " 3xt"  \r\n] | [ " 3xt"  ]    | [ 3xt]   |
    +------------------+----------------+----------+

Por sentido común el programador esperaría que todas estas hileras fueran reconocidas, pero de acuerdo al RFC-4180 únicamente la primera es correcta. Al usar trimCSV() en el valor obtenido al procesar esta línea, se obtiene a fin de cuentas el valor esperado.

  • Sin embargo, los campos que contienen cambios de línea "\r" o fines de línea "\n" seguramente son procesados de una manera diferente a lo esperado por getNextCSV(), aún antes de ser recibidos como argumentos de trimCSV(), por lo que es mejor no confiar en que esta rutina es una solución completa cuando se usan archivos.csv que no están escritos con apego estricto a la especificación RFC-4180.

    {{  // test::trimCSV()
        CSV_line csv("\"zero\",  \"if \"\" 1\" , , \" 3xt\"  \r\f"); std::string s;
        s=csv[0]; assertTrue( s == "zero" );             trimCSV(s); assertTrue( s == "zero"    );
        s=csv[1]; assertTrue( s == "  \"if \"\" 1\" " ); trimCSV(s); assertTrue( s == "if \" 1" );
        s=csv[2]; assertTrue( s == " " );                trimCSV(s); assertTrue( s == ""        );
        s=csv[3]; assertTrue( s == " \" 3xt\"  \r\f" );  trimCSV(s); assertTrue( s == " 3xt"    );
    }}
Ver también:
test_CSV::test_trimCSV()

Definición en la línea 259 del archivo CSV.cpp.

void chop ( std::string &  str,
char  ch 
)

Elimina ch si es el último caracter de str.

  • El caracter eliminado siempre es ch.

    {{  // test::chop()
        std::string str; char ch;
        str = "12345"; assertTrue( str == "12345" );
        chop(str,'0'); assertTrue( str == "12345" );

        for ( ch='5'; ch != '0'; --ch ) {
            assertTrue( str[str.size()-1] == ch );
            chop(str,ch);
        }

        assertTrue( str == "" );
        chop(str,'3'); assertTrue( str == "" );
    }}
Ver también:
test_CSV::test_chop()

Definición en la línea 304 del archivo CSV.cpp.


Generado el Wed May 27 11:04:47 2009 para CSV: por  doxygen 1.5.8