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