Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在导入包含中间空行的平面文件时删除空格?_Sql_Ssis - Fatal编程技术网

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

Sql 如何在导入包含中间空行的平面文件时删除空格?,sql,ssis,Sql,Ssis,我有一个非常简单的文本文件,它包含两个逗号分隔的值,大约100行长。这个文件是由一个自动过程(我无法控制)创建的,我通过SSIS将这个文件导入SQL 我的工作做得很好,除非文件中有空行。我的意思是它是完全空白的-没有逗号或其他字符。如果文件中存在该值,则直接导入后的记录,导入值前有两个空格 例如,如果文本行包含此“ABC,123”,则导入的SQL值将是第一列的“ABC”。我试图通过使用带有TRIM语句的派生列来消除这种情况,但没有效果。替换功能也不起作用。真正奇怪的是,如果我直接在数据流目标之前

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

我的工作做得很好,除非文件中有空行。我的意思是它是完全空白的-没有逗号或其他字符。如果文件中存在该值,则直接导入后的记录,导入值前有两个空格

例如,如果文本行包含此“ABC,123”,则导入的SQL值将是第一列的“ABC”。我试图通过使用带有TRIM语句的派生列来消除这种情况,但没有效果。替换功能也不起作用。真正奇怪的是,如果我直接在数据流目标之前添加一个Data Viewer,该值看起来很好。我甚至添加了星号,这样我就可以“看到”空间,如果它们存在的话,比如:

"*" + REPLACE([Column 0]," ","") + "*"
这是一个非常恼人的问题,如果有任何建议,我将不胜感激。
谢谢大家!

这里有一种方法。您可以在数据流任务中使用
脚本组件
转换来清理数据

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

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

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

  • 您的数据流任务将如下所示

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

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

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

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

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

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

希望有帮助


明白了-其他人在另一个论坛上回复了这个问题。我需要删除出现的不可见的CRLF字符,如下所示:

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

这很有帮助!我不需要擦洗空间,而是在日期时间擦洗,这篇文章正好说明了我需要什么

这可能不是发布此消息的正确论坛,但以下是我的代码片段:

    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;
    }

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

Siva-感谢您非常详细的回复。与直接在派生列中进行替换相比,使用此选项对您是否有好处?Siva-感谢您的澄清和伟大的总结。您获得了“接受答案”分类(理解表达方法是一种替代方法)。
    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;
    }