/// <summary>
        /// Load a CSV file, read all entries and return ListItem objects
        /// </summary>
        /// <param name="filename">CSV file</param>
        /// <returns>Enumarator of ListItem objects</returns>
        public static IEnumerable<ListItem> LoadCSV(string filename)
        {
            char valuedelimiter = ',';
            char keywordDelimiter = ';';
            string[] lineParts;
            List<ListItem> listItems = new List<ListItem>();
            List<string> headers = new List<string>() ;
            int lineCounter = 0;

            try
            {
                using (var textReader = new System.IO.StreamReader(filename))
                {
                    while (!textReader.EndOfStream)
                    {
                        lineCounter++;
                        lineParts = textReader.ReadLine().Split(valuedelimiter);

                        // The first line should be a header, read that to know the index of the columns
                        if (lineCounter==1)
                        {
                            for (int h = 0; h < lineParts.Length; h++)
                                headers.Add(lineParts[h]);
                            continue;
                        }

                        // Do some validation on this line
                        if (lineParts.Length != headers.Count())
                            throw new FormatException("Number of values doesn't match number of headers.");

                        ListItem newListItem = new ListItem();
                        // Get the all the values, whatever they are
                        for (int i=0;i<lineParts.Length;i++)
                        {
                            // Keywords need special handling
                            if (headers[i]=="keywords")
                            {
                                string[] keywords = lineParts[i].Split(keywordDelimiter);
                                foreach (string keyword in keywords)
                                    newListItem.AddKeyword(keyword);
                            }
                            else if (isString(lineParts[i]))
                                newListItem[headers[i]] = lineParts[i];
                            else
                                newListItem[headers[i]] = int.Parse(lineParts[i]);

                        }

                        listItems.Add(newListItem);
                    }
                    return listItems;
                }
            }
            catch (FormatException ex)
            {
                throw new FormatException("Error parsing CSV file " + filename + " at line " + lineCounter, ex);
            }
        }