【问题标题】:SSIS Derived column trailing zerosSSIS派生列尾随零
【发布时间】:2013-05-09 13:05:39
【问题描述】:

我有一个派生列的问题。基本上我有一个包含分隔数据的平面文件源。

我的一些列是货币,数据以一种奇怪的格式保存(旧系统倾向于这样做)。

无论如何,数据保存为:00030.200, 0123.410,0002231.210

我需要将这些字符串转换为货币 DT_CY。 我已经尝试使用所有不同的数字类型进行直接转换,但它们都失败了(不确定是前导零还是尾随零导致它)

所以我的问题很简单。我可以在派生列中使用什么表达式来删除前导零和尾随零。请注意,数据的长度始终不同,因此不能完全进行左/右子字符串选项。

有什么帮助吗?

发送

【问题讨论】:

    标签: ssis


    【解决方案1】:

    您可以使用派生列以这种方式完成:

    Replace(Ltrim(Replace(dataToConvert, "0", " ")), " ", "0")
    

    基本上,您可以将零转换为空格以利用 Ltrim 函数。

    我创建了这个解决方案here

    以下是如何进行的示例: (假设我们要转换 0040.300。 为此,我们可以将数字显示为:|0|0|4|0|。|3|0|0|看看 Replace 语句如何影响我们的数据)

    基本上0040.300的转换会这样操作:

    • 内部替换:| | |4| |.|3| | | ('0' 变成空格)
    • Ltrim:|4| |.|3| | | (左边的空格被修剪)
    • 外部替换:|4|0|.|3|0|0| (空格变为“0”)

    所以我们最终得到 40.300。

    【讨论】:

    • 这不是要替换字符串中间的零吗?示例 012301.11 这不是 1231.11。不确定,只是问问。
    • 好的,这很有意义。我将您的答案标记为答案,因为即使我在下面的答案也可以,但为这样的简单事情编写代码并不是 SSIS 的最佳实践。 Tx 为您提供帮助。
    • 它也在替换 0 中的 0。对于重新浮动这个感到抱歉。
    【解决方案2】:

    好的,所以我自己通过玩“脚本组件”并使用以下代码删除传入的所有属性的所有前导空格来找到答案:

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        var rowProperties = Row.GetType().GetProperties();
        foreach (var rowColumn in rowProperties)
        {           
    
            if (rowColumn.PropertyType == typeof(System.String))
            {          
                var rowValue = rowColumn.GetValue(Row, null);    
                rowColumn.SetValue(Row, rowValue.ToString().TrimStart('0'), null);
            }
        }        
    } 
    

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多