private DataTable CreateRowType(StreamReader reader, char delimiter, bool columnNameHeader) { string[] values = new string[MaxTextColumns]; StringBuilder sb = new StringBuilder(); string[] header = null; int maxcols = 0; CsvParser parser = new CsvParser(delimiter); while (!reader.EndOfStream) { maxcols = parser.Get(reader, values); if (maxcols > 0 && columnNameHeader) { header = new string[maxcols]; Array.Copy(values, header, maxcols); break; } } List<string> names = new List<string>(); DataProviderHelper helper = new DataProviderHelper(); DataTable dt = RowType.CreateSchemaTable(); for (int k = 0; k < maxcols; k++) { DataRow dr = dt.NewRow(); dr["ColumnOrdinal"] = k; if (columnNameHeader && header != null && k < header.Length) { String name = helper.NativeFormatIdentifier(header[k]); if (String.IsNullOrEmpty(name)) name = "Col"; dr["ColumnName"] = Util.CreateUniqueName(names, name); } else dr["ColumnName"] = String.Format("Col{0}", k + 1); dr["DataType"] = typeof(System.String); dt.Rows.Add(dr); } return dt; }
private DataTable CreateRowType(IniFile ini, string section, ref TextFileDataFormat df) { ParseIniTextDataFormat(ini, section, ref df); ParseIniCharacterSet(ini, section, ref df); df.DateTimeFormat = GetIniString(ini, section, "DateTimeFormat", df.DateTimeFormat); df.DecimalSymbol = GetIniString(ini, section, "DecimalSymbol", df.DecimalSymbol); df.CurrencySymbol = GetIniString(ini, section, "CurrencySymbol", df.CurrencySymbol); df.CurrencyThousandSymbol = GetIniString(ini, section, "CurrencyThousandSymbol", df.CurrencyThousandSymbol); df.CurrencyDecimalSymbol = GetIniString(ini, section, "CurrencyDecimalSymbol", df.CurrencyDecimalSymbol); df.NumberDigits = GetIniNumber(ini, section, "NumberDigits", df.NumberDigits); df.CurrencyDigits = GetIniNumber(ini, section, "CurrencyDigits", df.CurrencyDigits); df.ColumnNameHeader = GetIniBoolean(ini, section, "ColNameHeader", df.ColumnNameHeader); df.NumberLeadingZeros = GetIniBoolean(ini, section, "NumberLeadingZeros", df.NumberLeadingZeros); df.SequentialProcessing = GetIniBoolean(ini, section, "SequentialProcessing", df.SequentialProcessing); ParseCurrencyNegFormat(ini, section, ref df); ParseCurrencyPosFormat(ini, section, ref df); df.NullValue = GetIniString(ini, section, "NullValue", null); List<string> names = new List<string>(); List<int> length = new List<int>(); DataProviderHelper helper = new DataProviderHelper(); DataTable dt = RowType.CreateSchemaTable(); string[] keys = ini.GetEntryNames(section); Regex regex = new Regex("^Col[0-9]+$"); StringBuilder sb = new StringBuilder(); string[] values = new string[4]; int ordinal = 0; for (int k = 0; k < keys.Length; k++) if (regex.IsMatch(keys[k])) { CsvParser parser = new CsvParser(' '); if (parser.Get((string)ini.GetValue(section, keys[k]), values) > 0) { DataRow dr = dt.NewRow(); dr["ColumnOrdinal"] = ordinal++; dr["ColumnName"] = Util.CreateUniqueName(names, helper.NativeFormatIdentifier(values[0])); dr["DataType"] = DecodeDataType(values[1]); if (values[2] == "Width" && values[3] != null) { int size = Int32.Parse(values[3]); if ((System.Type)dr["DataType"] == typeof(System.String)) dr["ColumnSize"] = size; length.Add(size); } else if (df.TextFormat == TextDataFormat.FixedLength) throw new ESQLException(Properties.Resources.ExpectedWidthInSchemaIni, values[0]); dt.Rows.Add(dr); } } if (df.TextFormat == TextDataFormat.FixedLength) { if (dt.Rows.Count == 0) throw new ESQLException(Properties.Resources.ColumnDataTypeRequred); df.Width = length.ToArray(); } return dt; }