4

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

我的工作非常好,除非文件中有空行。我的意思是它完全是空白的——没有逗号或其他字符。当文件中存在这个时,它后面的记录将被导入,在导入的值之前有两个空格。

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

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

这是一个非常烦人的问题,我将不胜感激任何建议。谢谢!

4

4 回答 4

10

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

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

有问题的文件

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

无效数据

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

转型

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

数据流任务

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

输入列

  • 在 Inputs and Outputs 部分,创建一个名为CleansedDatadata type的新列string。这个新列将保存没有空格的干净输出。

输入和输出

  • 在脚本部分,单击编辑脚本按钮以打开脚本编辑器。

脚本

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

脚本代码

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

脚本代码

  • 现在,在您的 OLE DB 目标中,将旧列替换CleansedData为列映射部分中的这个新列。

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

希望有帮助。

干净的数据

于 2012-04-30T18:42:39.723 回答
1

Got it - someone else replied to this in another forum. I needed to remove the invisible CRLF characters that were coming across like this:

LTRIM(REPLACE(REPLACE([Column 0],"\n",""),"\r",""))
于 2012-04-30T19:40:17.407 回答
1

这很有帮助!我不需要擦洗空格,而是需要时间擦洗,这篇文章向我展示了我所需要的。

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

    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;
    }
于 2016-01-07T16:05:47.610 回答
0

确保在 Columns 菜单下的 Row Delimiter 下拉框中选择 {CR}{CL}。

于 2018-10-09T14:03:40.673 回答