Purpose: Splits a line from a .csv file into it's fields. Copes with quoted values automatically, removes double-quote pairs if present and de-escapes sequences.

Return TypeFunction nameArguments
hzEcodeSplitCSV(hzArray<hzString>&,const char*,char,)

Declared in file: hzTextproc.h
Defined in file : hzTextproc.cpp

Function Logic:

0:START 1:items i 2:unknown 3:Return E_ARGUMENT 4:unknown 5:cDelim 6:unknown 7:unknown 8:unknown 9:unknown 10:unknown 11:items items 12:unknown 13:items items 14:unknown 15:items items 16:unknown 17:items items 18:unknown 19:items items 20:unknown 21:items 22:unknown 23:items 24:unknown 25:S items items items 26:unknown 27:items 28:unknown 29:unknown 30:items items 31:unknown 32:items items 33:unknown 34:items items 35:unknown 36:items items 37:items items 38:Return E_OK

Function body:

hzEcode SplitCSV (hzArray<hzString>& ar)const char* line, char cDelim, 
{
   //  Category: Text Processing
   //  
   //  Purpose: Splits a line from a .csv file into it's fields. Copes with quoted values automatically, removes double-quote pairs
   //     if present and de-escapes sequences.
   //  
   //  Arguments: 1) ar  Either an array of char* or an array of hzString
   //     2) line The line to be split (char*)
   //     3) cDelim Delimitor char
   //  
   //  Returns: E_ARGUMENT If either the target array or the line is empty
   //     E_FORMAT If the number of fields does not match expected number
   //     E_OK  If successful
   hzChain     C ;     //  Working chain
   const char* i ;     //  Input iterator
   hzString    S ;     //  Data field
   ar.Clear() ;
   i = line ;
   if (!i || !i[0])
       return E_ARGUMENT ;
   if (!cDelim || cDelim == CHAR_DQUOTE)
       cDelim = CHAR_COMMA ;
   for (;;)
   {
       if (*i == CHAR_DQUOTE)
       {
           for (i++ ; *i ; i++)
           {
               if (*i == CHAR_BKSLASH)
               {
                   if (i[1]== ''r''){i++ ; C.AddByte(CHAR_CR) ; continue ; }
                   if (i[1]== ''n''){i++ ; C.AddByte(CHAR_NL) ; continue ; }
                   if (i[1]== ''t''){i++ ; C.AddByte(CHAR_TAB) ; continue ; }
                   if (i[1]== ''&quot;''){i++;C.AddByte(CHAR_DQUOTE);continue; }
               }
               if (i[0]== CHAR_DQUOTE && i[1]== CHAR_DQUOTE)
                   { i++ ; C.AddByte(CHAR_DQUOTE) ; continue ; }
               if (*i == CHAR_DQUOTE)
                   break ;
               C.AddByte(*i) ;
           }
           if (*i == CHAR_DQUOTE)
               i++ ;
           else
               break ;
       }
       if (*i == 0|| *i == cDelim)
       {
           S = C ; ar.Add(S) ; C.Clear() ; S.Clear() ;
           if (*i == 0)
               break ;
           i++ ;
           continue ;
       }
       //  Just add char to chain
       if (*i == CHAR_BKSLASH)
       {
           if (i[1]== ''r''){i++ ; C.AddByte(CHAR_CR) ; continue ; }
           if (i[1]== ''n''){i++ ; C.AddByte(CHAR_NL) ; continue ; }
           if (i[1]== ''t''){i++ ; C.AddByte(CHAR_TAB) ; continue ; }
           if (i[1]== ''&quot;''){i++;C.AddByte(CHAR_DQUOTE);continue; }
       }
       C.AddByte(*i) ;
       i++ ;
   }
   return E_OK ;
}