平面文件导入:删除数据

时间:2013-08-27 19:18:48

标签: sql regex tsql ssis

(早些时候发布过类似问题,但人力资源部门今天改变了条件)

我们的人力资源部门以平面文件的形式从SAP系统自动导出。平面文件中的信息如下所示。

G/L Account 4544000 Recruiting/Job Search
Company Code 0020

-------------------------- 
| Posting Date| LC amnt|
|------------------------|
| 01/01/2013 | 406.25 |
| 02/01/2013 | 283.33 |
| 03/21/2013 |1,517.18 |
--------------------------
G/L Account 4544000 Recruiting/Job Search
Company Code 0020

-------------------------- 
| Posting Date| LC amnt|
|------------------------|
| 05/01/2013 | 406.25 |
| 06/01/2013 | 283.33 |
| 07/21/2013 |1,517.18 |
--------------------------

当我查看SSIS平面文件源连接中的数据时,所有信息都在一列中。我试图使用Delimiter设置为Pipe但它不会分离数据,我假设由于文件顶部和中间的非必要信息。

我需要删除顶部和中间的数据,然后将Date和Total拆分为两个单独的列。

这样做的目的是分离数据,以便我可以获得运行年份的单个SUM。

Year    Total
2013    $5123.25

我曾尝试在SSIS中执行此操作,但我似乎无法将列分开或删除数据。我想避免脚本任务,因为我不熟悉该组件的代码或操作。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

我会创建一个可以导入整个平面文件的临时表,然后在SQL级别上进行过滤

一个例子

  1. 创建TABLE tmp(txtline VARCHAR(MAX))

  2. 将BCP或SSIS文件放入tmp表

  3. 像这样运行查询以获得结果(您可能需要调整字符串长度以适合您的平面文件)

    WITH cte AS( 选择   CAST(SUBSTRING(txtline,2,10)AS DATE)AS PostingDate,   CAST(REPLACE(替换(SUBSTRING(txtline,15,100),'|',''),',','')AS NUMERIC(19,4))AS LCAmount 来自tmp 在哪里(SUBSTRING(txtline,2,10))= 1 ) 选择    YEAR(PostingDate)    SUM(LCAmount) 来自cte GROUP BY YEAR(PostingDate)

答案 1 :(得分:0)

也许您可以使用MS-Excel打开平面文件,使用竖线字符作为分隔符,然后根据需要从中创建CSV。

答案 2 :(得分:0)

缺少脚本任务/组件(或完整的自定义SSIS组件),我认为您无法在SSIS中解析该特定格式。平面文件连接管理器允许您选择要跳过的标题文本文件行数,但您显示的格式有多个部分(因此有多个标题)。还存在水平线的问题,平面文件连接将无法正确处理。

我首先看看是否有办法从SAP获取包含此数据的普通CSV文件。如果事实证明这是不可能的,那么你需要一些类型的自定义代码去除多余的文本。