Esempio n. 1
0
        public bool ImportCSV(string filename, bool headerrow, UpdateMode mode, out string error, ImportFlags flags)
        {
            error = string.Empty;

            DataTable importTable = Data.Clone(); //Clone table structure to help with mapping

            List <int> usedids  = new List <int>();
            int        idcolumn = Data.Columns[Key].Ordinal;
            int        maxid    = int.MinValue;

            string pathOnly = Path.GetDirectoryName(filename);
            string fileName = Path.GetFileName(filename);

            Func <string, string> Unescape = s =>
            {
                if (s.StartsWith("\"") && s.EndsWith("\""))
                {
                    s = s.Substring(1, s.Length - 2);
                    if (s.Contains("\"\""))
                    {
                        s = s.Replace("\"\"", "\"");
                    }
                }
                return(s);
            };

            try
            {
                using (StreamReader sr = new StreamReader(File.OpenRead(filename)))
                {
                    if (headerrow)
                    {
                        sr.ReadLine();
                    }

                    while (!sr.EndOfStream)
                    {
                        string   line = sr.ReadLine();
                        string[] rows = Regex.Split(line, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))", RegexOptions.Compiled);
                        DataRow  dr   = importTable.NewRow();

                        for (int i = 0; i < Data.Columns.Count; i++)
                        {
                            string value = Unescape(rows[i]);

                            switch (Data.Columns[i].DataType.Name.ToLower())
                            {
                            case "sbyte":
                                dr[i] = Convert.ToSByte(value);
                                break;

                            case "byte":
                                dr[i] = Convert.ToByte(value);
                                break;

                            case "int32":
                            case "int":
                                dr[i] = Convert.ToInt32(value);
                                break;

                            case "uint32":
                            case "uint":
                                dr[i] = Convert.ToUInt32(value);
                                break;

                            case "int64":
                            case "long":
                                dr[i] = Convert.ToInt64(value);
                                break;

                            case "uint64":
                            case "ulong":
                                dr[i] = Convert.ToUInt64(value);
                                break;

                            case "single":
                            case "float":
                                dr[i] = Convert.ToSingle(value);
                                break;

                            case "boolean":
                            case "bool":
                                dr[i] = Convert.ToBoolean(value);
                                break;

                            case "string":
                                dr[i] = value;
                                break;

                            case "int16":
                            case "short":
                                dr[i] = Convert.ToInt16(value);
                                break;

                            case "uint16":
                            case "ushort":
                                dr[i] = Convert.ToUInt16(value);
                                break;
                            }

                            //Double check our Ids
                            if (i == idcolumn)
                            {
                                int id = (int)dr[i];

                                if (flags.HasFlag(ImportFlags.TakeNewest) && usedids.Contains(id))
                                {
                                    var prev = importTable.Rows.Find(id);
                                    if (prev != null)
                                    {
                                        importTable.Rows.Remove(prev);
                                    }
                                }
                                else if (flags.HasFlag(ImportFlags.FixIds) && usedids.Contains(id))
                                {
                                    dr[i] = ++maxid;
                                    id    = (int)dr[i];
                                }

                                usedids.Add(id);             //Add to list
                                maxid = Math.Max(maxid, id); //Update maxid
                            }
                        }

                        importTable.Rows.Add(dr);
                    }
                }
            }
            catch (FormatException ex)
            {
                error = $"Mismatch of data to datatype in row index {usedids.Count + 1}";
                return(false);
            }
            catch (Exception ex)
            {
                error = ex.Message;
                return(false);
            }

            switch (Data.ShallowCompare(importTable, false))
            {
            case CompareResult.Type:
                error = "Import Failed: Imported data has one or more incorrect column types.";
                return(false);

            case CompareResult.Count:
                error = "Import Failed: Imported data has an incorrect number of columns.";
                return(false);
            }

            UpdateData(importTable, mode);
            return(true);
        }