如何在导入包含中间空白行的平面文件时删除空格?

时间:2012-04-30 17:01:05

标签: sql ssis

我有一个非常简单的文本文件,其中包含两个以逗号分隔的值,大约100行。此文件由自动进程(我无法控制)创建,我通过SSIS将此文件导入SQL。

除非文件中有空行,否则我的工作非常有效。通过这个,我的意思是它完全是空白的 - 没有逗号或其他字符。如果文件中存在此文件,则导入后的记录将在导入的值之前以两个空格导入。

例如,如果文本行包含此“ABC,123”,则导入的SQL值将为第一列的“ABC”。我试图通过使用带有TRIM语句的派生列来删除它,但这没有任何效果。 REPLACE功能也不起作用。真正奇怪的是,如果我在数据流Destination之前直接添加数据查看器,则该值看起来很好。我甚至添加了星号,以便我可以“看到”空格,如果它们存在,就像这样:

"*" + REPLACE([Column 0]," ","") + "*"

这是一个非常恼人的问题,我非常感谢任何建议。 谢谢!

4 个答案:

答案 0 :(得分:9)

这是一种方法。您可以在数据流任务中使用Script Component转换来清理数据。

  • 这是一个示例文件,代表与您的问题类似的数据。注意第二行有两个空格而没有实际数据。

file with issue

  • 使用平面文件源和OLE DB目标直接将文件导入表中时,在将第二行导入文件之前存在空白问题。

invalid data

  • 要解决此问题,必须在平面文件和OLE DB目标之间引入脚本组件转换。拖放脚本组件时,请选择 Transformation

transformation

  • 您的数据流任务看起来像这样。

data flow task

  • 双击脚本组件以显示脚本转换编辑器。在“输入”列上,选择要从文件中读取的第一列。在这种情况下,列为Name

input columns

  • 在“输入和输出”部分,创建一个名为CleansedData的数据类型为string的新列。这个新列将保持没有空格的干净输出。

inputs and outputs

  • 在“脚本”部分,单击“编辑脚本”按钮以显示“脚本编辑器”。

script

  • 在脚本编辑器中,更改方法Input0_ProcessInputRow中的代码,如下所示。此代码用空白文本替换回车符+换行符,然后修剪文本周围的任何空格。

脚本代码

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Row.CleansedData = Row.Name.Replace(@"\r\n", string.Empty).Trim();
}

script code

  • 现在,在您的OLE DB目标中,使用列映射部分中的新列CleansedData替换旧列。

  • 进行上述更改后,将对包含空格的同一文件执行包。这次没有在第二行之前插入空格。

希望有所帮助。

clean data

答案 1 :(得分:1)

知道了 - 其他人在另一个论坛上回复了这个问题。我需要删除像这样出现的隐形CRLF字符:

LTRIM(REPLACE(REPLACE([Column 0],"\n",""),"\r",""))

答案 2 :(得分:0)

这非常有帮助!我不需要擦洗空间而是日期时间擦洗,这篇文章向我展示了我需要的东西。

这可能不是发布此内容的正确论坛,但这是我的代码的片段:

    DateTime dt = DateTime.Now;
    string str_test = "";

    try
    {
        str_test = Row.SomeDate;

        if (str_test.Length == 8)
        {
            // date example: 20151231
            str_test = str_test.Insert(6, @"/");
            str_test = str_test.Insert(4, @"/");

            dt = Convert.ToDateTime(str_test);
            Row.CleansedDate = Row.SomeDate.;
        }
        else
        {
            // test for some other date
            dt = Convert.ToDateTime(str_test);
            Row.CleansedDate = Row.SomeDate;
        }
    }
    catch (Exception)
    {
        // this is not a date, return nothing
        Row.CleansedDate = null;
    }

答案 3 :(得分:0)

确保在“列”菜单下的“行分隔符”下拉框中选择{CR} {CL}。