Validation of Excel file data before importing to Database
我正在尝试将Excel文件中的数据读取到DataTable。我知道,当向DataTable添加列时,我们可以为DataColumn分配不同的DataTypes。到目前为止,我尝试了以下方法,
1 2 3 4 5 6
| DataTable dt = new DataTable ();
dt .Columns.AddRange(new DataColumn [2]
{
new Datacolumn ("column1", typeof(string)),
new DataColumn ("column2", typeof(int))
}); |
我的Excel文件有两列数据,如下所示:
第1列------第2列
ABC-----------230
定义-----------230TR
如上所示,第二行第二列的值为'230tr',DataTable不应接受抛出异常,因为数据字段和行号无效。
普拉维娜
- 包含数字的字符串呢?说WD40?您希望在该实例中输入什么?
- 嗨,乔恩,"WD40"作为一根绳子会很好。但不应允许整体使用数值并引发异常。
- 可以使用正则表达式来筛选数据。添加一个函数,在该函数中传递列值并返回true/false,并且基于返回仅继续该列或继续该列。请参阅链接-stackoverflow.com/questions/1181419/…
- u plz可以显示如何将上述值添加到数据表列中的代码吗?
- 嗨,Ajay,使用正则表达式是一种解决方案。但我发现验证可以从数据表本身完成。谢谢。
感谢大家的回答,我在与DataTables合作时找到了一个简单的问题解决方案。我的主要任务是从Excel文件工作表中读取数据行,并在将其添加到数据库表(使用OracleBluckCopy)之前验证每行数据,并使用Excel文件工作表中的任何无效数据字段通知用户。
当我使用oda.Fill(dt);从excel文件表中导入数据到DataTable时,我意识到在向DataTable添加数据的过程中,有些DataRow字段为空(空)。
正如我在上述主要问题中所提到的,我们可以将DataType分配给DataTable中的DataColumn,如下所示:
1 2 3 4 5 6 7
| DataTable dt = new DataTable ();
dt .Columns.AddRange(new DataColumn [3]
{
new Datacolumn ("column1", typeof(string)),
new DataColumn ("column2", typeof(double)),
new DataColumn ("column3", typeof(DateTime ))
}); |
我的Excel文件表如下:
第1列-----------第2列-----------第3列
ABCD--------------20000-------------------2018年12月20日
EFGH——56500.5——XYZ17——2018年3月
IJKLM——67000——2018年1月1日
上表第3行第3列中,RowData为无效日期类型(xyz17-mar-2018)。在执行oda.fill(dt)时,对于上表,此数据字段作为空的RowData添加到DataTable中。如果导入的数据字段不属于定义的DataColumn类型,其他列的情况也一样。因此,我的最后一步是检查DataTable的每一行数据,该数据有一个空字段,并向用户发送一条错误消息,其中提到了行号和列名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int errorRowNumber = 0;
private bool validateDataTableData(DataTable dt, string dtColumnName)
{
Boolean isTrue = false;
foreach (DataRow r in dt.Rows)
{
if(!string.IsNullOrEmpty(r[dtColumnName].ToString()))
{
isTrue = false;
errorRowNumber = dt.Rows.IndexOf(r) + 2;
break;
}
}
return isTrue;
} |
- 1。我没有看到异常或错误消息被抛出?2。如何根据原始日志删除数值?三。你的"我"总是错的。
你可以这样试试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| DataTable dt = new DataTable ();
dt .Columns.AddRange(new DataColumn [2]
{
new DataColumn ("column1", typeof(int)),
new DataColumn ("column2", typeof(string))
});
dt .Clear();
try
{
string input = string.Empty;
input = Console .ReadLine();
if (Regex .IsMatch(input, @"^[a-zA-Z]+$"))
{
dt .Rows.Add(1, input );
}
Console .WriteLine(dt .Rows[0]["column2"]);
Console .ReadKey();
}
catch(Exception ex )
{
Console .WriteLine(ex );
Console .ReadKey();
} |
在您的代码中,当您读取要插入的Excel值时,您应该使用c函数:[Int32.TryParse][1]或float.Try?Parse;
它将告诉您字符串是否将转换为浮点(或整数),在这种情况下,不插入它。
您可以在这里看到一个详细的示例/答案:
- 嗨,丹尼尔,谢谢你的回复。我在向DataTable添加行时使用下面的实现。using (OleDBDataAdapter oda = new OleDBDataAdapter("SELECT * FROM [excel_sheet]", excel_con)) { oda.Fill(dt); },然后我使用"oraclebulkcopy"将DataTable中的数据立即添加到我的数据库中。所以我需要在向DataTable添加数据时进行验证。我怎样才能做到?
- 将数据读取到临时数据结构(如字典)中。然后使用验证。
- 或者只使用现有的数据表dt并执行Linq选择以消除数值