我有一个序列化的代码,并且在此代码中有一些数字值,这些数字值在解析后代表日期。
For example, 011756420176654
*Note* array index may be off
Substring(1,2) = 01
Substring(3,2) = 17
我试图忽略该行,而不替换原始行。我有一个派生的列,并且正在该列中进行。
(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + (dt_str,10,1252)datepart("year",getdate()))
我的目的是在派生列中的“ TryParse”逻辑失败时将错误输出配置为忽略[我的代码]字段。我知道如果我要传递派生的列,那么在配置上选择忽略将传递null,但是问题是我试图(在错误时)忽略源行并将其传递为null(即[我的代码])。
此匹配项进入数据库后,另一个进程将其消耗掉并尝试解析日期。它不会在null值上失败,因此我想在允许通过记录或将其设置为null之前验证本质上是“ is date”逻辑。
编辑:Per Keith的解决方案,我来了。我在访问输出缓冲区时遇到问题,但是在语法上经过MSDN讨论之后,我想到了下面的方法,它们可以很好地工作。
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
DateTime dateValue;
string test = Row.ReceiptCode.Substring(0, 2) + "/" + Row.ReceiptCode.Substring(2, 2) + "/" + DateTime.Now.Year.ToString();
if (DateTime.TryParse(test, out dateValue) && Row.ReceiptCode.Length ==16)
{
Output0Buffer.AddRow();
Output0Buffer.EndDate = Row.EndDate;
Output0Buffer.Q10 = Row.Q10;
Output0Buffer.Q8 = Row.Q8;
Output0Buffer.ValidatedReceipt = Row.ReceiptCode;
}
else
{
Output1Buffer.AddRow();
Output1Buffer.EndDate = Row.EndDate;
Output1Buffer.Q10 = Row.Q10;
Output1Buffer.Q8 = Row.Q8;
Output1Buffer.Error = Row.ReceiptCode;
}
}
答案 0 :(得分:3)
我将使用脚本转换:
添加输出列(convDate)并检查[我的代码]为已读:
这是您的代码:
string test = Row.[My Code].Substring(1,2) + "/" + Row.[My Code].Substring(3,2)+"/" + DateTime.Now.Year.ToString();
if (DateTime.TryParse(test, out dateValue))
{Row.convDate = dateValue; }
答案 1 :(得分:3)
(从性能角度而言)最好避免在使用简单表达式时使用脚本组件
派生列表达式中的问题是缺少第二个破折号-
并指定了50
作为字符串的长度,请尝试使用以下表达式:
(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + "-" + (dt_str,50,1252)datepart("year",getdate()))
此外,在处理日期值时,最好使用通用日期格式YYYY-MM-DD
:
(dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2))
确保已将错误输出配置为忽略故障:
如果需要返回原始字符串值,请使用以下表达式:
((dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2)) == (dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2)))
? [My Code]
: NULL(dt_str,50,1252)