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); }