我有一个非常简单的文本文件,其中包含两个以逗号分隔的值,大约100行。此文件由自动进程(我无法控制)创建,我通过SSIS将此文件导入SQL。
除非文件中有空行,否则我的工作非常有效。通过这个,我的意思是它完全是空白的 - 没有逗号或其他字符。如果文件中存在此文件,则导入后的记录将在导入的值之前以两个空格导入。
例如,如果文本行包含此“ABC,123”,则导入的SQL值将为第一列的“ABC”。我试图通过使用带有TRIM语句的派生列来删除它,但这没有任何效果。 REPLACE功能也不起作用。真正奇怪的是,如果我在数据流Destination之前直接添加数据查看器,则该值看起来很好。我甚至添加了星号,以便我可以“看到”空格,如果它们存在,就像这样:
"*" + REPLACE([Column 0]," ","") + "*"
这是一个非常恼人的问题,我非常感谢任何建议。 谢谢!
答案 0 :(得分:9)
这是一种方法。您可以在数据流任务中使用Script Component
转换来清理数据。
Name
。
CleansedData
的数据类型为string
的新列。这个新列将保持没有空格的干净输出。
Input0_ProcessInputRow
中的代码,如下所示。此代码用空白文本替换回车符+换行符,然后修剪文本周围的任何空格。脚本代码:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.CleansedData = Row.Name.Replace(@"\r\n", string.Empty).Trim();
}
现在,在您的OLE DB目标中,使用列映射部分中的新列CleansedData
替换旧列。
进行上述更改后,将对包含空格的同一文件执行包。这次没有在第二行之前插入空格。
希望有所帮助。
答案 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}。