使用 SSIS 将 csv 文件导入 SQL 服务器时,从字符串中删除 space 的最有效方法是什么?
What is the most efficient way to remove a space from a string when importing a csv file to SQL Server using SSIS?
我将使用 SSIS 从数千个 CSV 文件中导入记录。这些 CSV 文件将包含一个邮政编码列,格式为 A5A 5A5,其中“A”是任意字母,“5”是 0 到 9 之间的任意数字。
我想删除“A5A”和“5A5”之间的 space,这样所有邮政编码都显示为“A5A5A5”。
我正在查看文档并看到几个选项,我正在尝试缩小最佳选项的范围,即需要最少步骤的选项。到目前为止,我正在查看 Derived Column 转换,但这将涉及向我的 SQL Table.
添加另一列
有什么方法可以 trim space 而无需添加额外的列?
正如@Larnu 通过评论回答的那样,派生列可能是最适合在此处使用的组件。
您要查找的表达式是 REPLACE。语法应该是
REPLACE([PostalCode], " ", "")
您的 CSV 中有 10 列。派生列可以替换现有列或将新列添加到行缓冲区。我主张增加一个新专栏。 PostalCodeStripped
或类似的东西。在某些时候,数据会发生一些奇怪的事情,你会得到一个 A5A 5A5
没有得到 space 剥离。在调试中同时提供原始值和解析值可以帮助解决问题(哦,这有一个不间断的 space 或一个制表符而不是 space,或者除了)
但是,仅仅因为列在缓冲区中并不意味着您需要在目标 table 中为该列创建列。只需从行缓冲区取消映射 PostalCode
并将 PostalCodeStripped
映射到数据库中的 PostalCode
列。您会在目标组件中看到我在说什么。默认情况下,它们会根据名称匹配进行映射,但欢迎您按照自己认为合适的方式连接它们。
ETL 是另一种选择。将数据批量加载到暂存 table。然后对目标做一个简单的 select 来做转换。我可能不想使用 SSIS。 BCP 或 Import-DbaCsv(DBATools powershell 模块)都可以快速替代。如果您了解 PowerShell 并希望在管道中处理文件,则可以将文件通过管道传输到 Import-DbaCsv。 PowerShell 脚本还可以执行 Invoke-DbaQuery 以 运行 更新或插入查询以进行转换。
SSIS 也可以只进行批量加载,然后 运行 T-SQL 进行转换。我不喜欢维护和升级 SSIS 包的开销。我每天都会接受 T-SQL 的工作而不是 SSIS 的工作。 (我们有大约 1/2 年的时间让 FTE 将我们的 SSIS 包升级到 SQL 2019。T-SQL 作业在移动到新版本时继续工作。)
或者走ETL路线,在SSIS数据流中进行转换。平面文件源和 OLE DB 目标之间的派生列转换应该可以解决问题。
要处理多个文件,您可以使用 Foreach 循环容器。有一个使用通配符路径的文件枚举器。 (最初的 T-SQL 任务只是 t运行 对 table 进行测试。)
您需要对事物进行参数化以使文件源成为每个文件。
对于 PowerShell,它可能类似于(尚未转换)下面的脚本。
Get-ChildItem 'C:\TestFolder\*.csv' |
import-dbacsv -SqlInstance 'localhost\DEV' -Database 'Test' -Schema 'dbo' -Table 'Test' -AutoCreateTable -verbose
如果您 运行 在 ISE 中执行此操作,请注意一个错误,该错误在调用 import-dbacsv 后可能无法释放连接,这将导致连接挂起。据我所知,这不是命令行中的问题。 (如果您遇到这种情况,您可能必须终止 ISE 进程 - 关闭它是不够的。)
我将使用 SSIS 从数千个 CSV 文件中导入记录。这些 CSV 文件将包含一个邮政编码列,格式为 A5A 5A5,其中“A”是任意字母,“5”是 0 到 9 之间的任意数字。
我想删除“A5A”和“5A5”之间的 space,这样所有邮政编码都显示为“A5A5A5”。
我正在查看文档并看到几个选项,我正在尝试缩小最佳选项的范围,即需要最少步骤的选项。到目前为止,我正在查看 Derived Column 转换,但这将涉及向我的 SQL Table.
添加另一列有什么方法可以 trim space 而无需添加额外的列?
正如@Larnu 通过评论回答的那样,派生列可能是最适合在此处使用的组件。
您要查找的表达式是 REPLACE。语法应该是
REPLACE([PostalCode], " ", "")
您的 CSV 中有 10 列。派生列可以替换现有列或将新列添加到行缓冲区。我主张增加一个新专栏。 PostalCodeStripped
或类似的东西。在某些时候,数据会发生一些奇怪的事情,你会得到一个 A5A 5A5
没有得到 space 剥离。在调试中同时提供原始值和解析值可以帮助解决问题(哦,这有一个不间断的 space 或一个制表符而不是 space,或者除了)
但是,仅仅因为列在缓冲区中并不意味着您需要在目标 table 中为该列创建列。只需从行缓冲区取消映射 PostalCode
并将 PostalCodeStripped
映射到数据库中的 PostalCode
列。您会在目标组件中看到我在说什么。默认情况下,它们会根据名称匹配进行映射,但欢迎您按照自己认为合适的方式连接它们。
ETL 是另一种选择。将数据批量加载到暂存 table。然后对目标做一个简单的 select 来做转换。我可能不想使用 SSIS。 BCP 或 Import-DbaCsv(DBATools powershell 模块)都可以快速替代。如果您了解 PowerShell 并希望在管道中处理文件,则可以将文件通过管道传输到 Import-DbaCsv。 PowerShell 脚本还可以执行 Invoke-DbaQuery 以 运行 更新或插入查询以进行转换。
SSIS 也可以只进行批量加载,然后 运行 T-SQL 进行转换。我不喜欢维护和升级 SSIS 包的开销。我每天都会接受 T-SQL 的工作而不是 SSIS 的工作。 (我们有大约 1/2 年的时间让 FTE 将我们的 SSIS 包升级到 SQL 2019。T-SQL 作业在移动到新版本时继续工作。)
或者走ETL路线,在SSIS数据流中进行转换。平面文件源和 OLE DB 目标之间的派生列转换应该可以解决问题。
要处理多个文件,您可以使用 Foreach 循环容器。有一个使用通配符路径的文件枚举器。 (最初的 T-SQL 任务只是 t运行 对 table 进行测试。)
您需要对事物进行参数化以使文件源成为每个文件。
对于 PowerShell,它可能类似于(尚未转换)下面的脚本。
Get-ChildItem 'C:\TestFolder\*.csv' |
import-dbacsv -SqlInstance 'localhost\DEV' -Database 'Test' -Schema 'dbo' -Table 'Test' -AutoCreateTable -verbose
如果您 运行 在 ISE 中执行此操作,请注意一个错误,该错误在调用 import-dbacsv 后可能无法释放连接,这将导致连接挂起。据我所知,这不是命令行中的问题。 (如果您遇到这种情况,您可能必须终止 ISE 进程 - 关闭它是不够的。)