1

谷歌搜索了一些关于如何破解这个的提示。但没有得到任何有用的点击。现在,我想知道我是否可以在 SSIS 中实现相同的目标。

一个文件夹中有多个 .csv 文件。我想要实现的是:

  1. 打开每个 .csv 文件(我将使用参数作为文件名的更改)
  2. 删除一些列
  3. 以特定顺序重新排列剩余的列
  4. 保存 .csv 文件(没有 Excel 确认消息框)
  5. 关闭 .csv 文件
  6. 将处理后的文件移动到另一个文件夹。

并重新开始上述整个过程,直到处理完文件夹中的所有 .csv 文件。

最初我以为我可以使用 For Each Loop Container 和 Execute process Task 来实现这一点。但是,无法找到有关如何实现上述预期目标的任何资源。

示例: 每个 Source .csv 文件的标题:

代码| 姓名| 值 1 | 价值 2 | 价值 3 | 日期| 数量| 价格| VALUE_ADD |

我需要删除列:NAME | VALUE_ADD | ZONE 从每个文件中,并按以下顺序重新排列列。

所需的列顺序:

代码| 日期| 值 1 | 价值 2 | 价值 3 | 价格| 数量

我知道这在 SSIS 中是可能的。但我无法弄清楚。提前感谢您的帮助。

4

3 回答 3

1

使用以下四个步骤轻松完成:

  • 使用“平面文件连接”打开您的 CSV。
  • 使用“平面文件源”组件来读取您的 CSV。
  • 使用“派生列”组件重新排列列。
  • 使用“平面文件目标”组件保存 CSV。

瞧!

于 2012-10-09T12:06:32.130 回答
1

经过大量的试验,终于得到了想要的结果。最后,它看起来如此简单。

我创建这个包的主要动机是我有很多 .csv 文件,这些文件需要打开每个文件并运行一个消除几列的宏,并以所需的格式重新排列剩余的列。然后我必须在单击 Excel 确认框后手动保存每个文件。那变得太过分了。我只想要一键式的方法。

详细说明我所做的事情。希望它可以帮助那些想要从多个 .csv 文件中获取数据作为源的人,然后按照他们需要的顺序只获取所需的列,最后将所需的输出作为 .csv 文件保存到新的目的地。

简而言之,我只需要使用:

  • 对于每个循环容器
  • 其中的数据流任务

在数据流任务中:

  • 平面文件源
  • 平面文件目标
  • 2 个平面文件连接管理器 -目标各一个。

此外,必须使用 3 个变量- 所有带有项目范围的字符串数据类型 - 我将其命名为:CurrFileNameDestFilePathFolderPath

.

详细步骤:

为变量设置默认值:

CurrFileName:只需提供 .scv 文件 (test.csv) 之一的名称以供临时使用。

FolderPath:提供源 .csv 文件所在的路径(C:\SSIS\Data\Input

DestFilePath:提供要保存已处理文件的目标路径(C:\SSIS\Data\Input\Output

第 1 步:将 For Each 循环容器拖到控制流区域。

第 2 步:在集合中,选择枚举器为“Foreach 文件枚举器”。

第 3 步:在 Enumerator Configuration 下,在 Folder: 下提供 .csv 文件所在的文件夹路径(在我的例子中是C:\SSIS\Data\Input),在 Files: 中提供扩展名(在我们的例子中:*. csv)

第 4 步:在检索文件名下,选择“名称和扩展名”单选按钮。

第 5 步:然后转到变量映射部分并选择变量(在我的例子中:User::CurrFileName

第 6 步:创建源连接(我们称之为SrcConnection)- 在 Connection Managers 区域中右键单击并选择 Flat File Connection 管理器并选择其中一个 .csv 文件(用于临时目的)。转到“高级”选项卡并为您希望保留的列提供正确的所需数据类型。单击确定退出。

第 7 步:然后转到这个新创建的源平面文件连接的属性并单击与表达式字段相邻的小框以打开属性表达式编辑器。在 'Property' 下,选择 'ConnectionString' 并在 Expression 空间中输入:@[User::FolderPath] + "\" + @[User::CurrFileName]并单击 OK 退出。

第 8 步:在 Windows 资源管理器中,在 Source 文件夹中创建一个新文件夹(在我们的例子中:C:\SSIS\Data\Input\Output)

第 9 步:创建目标连接(我们称之为DestConnection) - 在 Connection Managers 区域中右键单击并选择 Flat File Connection 管理器并选择其中一个 .csv 文件(用于临时目的)。转到“高级”选项卡并为您希望保留的列提供正确的所需数据类型。单击确定退出。

第 10 步:然后转到这个新创建的源平面文件连接的属性并单击与表达式字段相邻的小框以打开属性表达式编辑器。在 'Property' 下,选择 'ConnectionString' 并在 Expression 空间中输入:@[User::DestFilePath] + @[User::CurrFileName]并单击 OK 退出。

第 11 步:将数据流任务拖到 Foreach 循环容器中。

第 12 步:在数据流任务中,拖动平面文件源并在平面文件连接管理器中:选择源连接(在本例中:SrcConnection)。在列中,取消选择所有列并仅选择您需要的列(按您需要的顺序),然​​后单击确定退出。

第 13 步:将平面文件目标拖到数据流任务并在平面文件连接管理器中:选择目标连接(在本例中:DestConnection)。然后,转到映射部分并验证映射是否符合所需的输出。单击确定退出。

第14步:就是这样。执行包。它应该毫无问题地执行。

希望这有帮助:-)

于 2012-10-10T11:46:59.597 回答
0

目前尚不清楚您为什么要使用 SSIS 来执行此操作:您的任务似乎是在数据库外部操作文本文件,并且通常在使用具有良好 CSV 解析的语言编写的小脚本或程序中执行此操作要容易得多支持(Perl、Python、PowerShell 等)。如果这应该是更大包的一部分,那么您可以简单地使用执行进程任务调用脚本。SSIS 是一个很棒的工具,但我觉得这样的任务很尴尬。

于 2012-10-09T20:53:36.053 回答