ssis - SSIS 包 - 从多个源文件中获取一列
问题描述
我正在尝试创建一个 SSIS 包,它可以接受转储到同一处理文件夹中的多个(已知)文件结构。我正在尝试AccountId
从每个文件中提取。
我遇到的问题是我的数据流任务仅适用于我为Flat File Source设置的一个特定文件。在我的平面文件源中,我只使 AccountId 列可用,但这似乎不能解决问题。
当前的 SSIS 包结构
Foreach 循环:循环指定文件夹中的所有文件
数据流任务:处理每个文件并存储在 SQL 表中
示例 CSV 文件结构
文件 1:
Name | AccountId | Address | City | State
John | 154235 | 1234 | LA | CA
文件 2:
Name | Address | City | State | AccountId | Phone
Kyle | 5825 | Test | KY | 534534 | 555-555-5555
文件 :
Name | Address | City | State | Email | AccountId | Phone
Bob | 52345 | Fake | WY | t@test.com | 756313 | 444-444-4444
解决方案
平面文件源将使用连接管理器中定义的列的位置。它不会尝试单独从每个文件的标题中提取位置。
如果您想创建一个可以处理列的不同位置的源,那么您可以购买可以处理这种情况的组件,或者使用脚本组件编写自己的组件。
下面是一个脚本组件的示例,它设置为应该完成这项工作的输出。您必须自己弄清楚文件的解析,但这不应该那么难。只是不要忘记为文件路径配置一个变量,并在Inputs and Outputs部分添加 AccountId 作为输出。
public override void CreateNewOutputRows()
{
int colIdx = -1;
var text = File.ReadAllText(Variables.FilePath); // Set in Script/ReadOnlyVariables
var rows = ParseText(text);
var firstRow = rows.FirstOrDefault().ToList();
// find matching row
for (var i = 0; i < firstRow.Count; i++)
{
if (firstRow[i] == "AccountId")
{
colIdx = i;
break;
}
}
foreach (var row in rows.Skip(1))
{
Output0Buffer.AddRow();
Output0Buffer.AccountId = row.Skip(colIdx).First(); // configure columns in output
}
}
public IEnumerable<IEnumerable<string>> ParseText(string text)
{
/** implement yourself. You can find examples online **/
}
推荐阅读
- c++ - 如何将多个参数传递给 std::thread?
- opencart-3 - 添加链接到管理菜单 opencart 版本 3.0.2.0
- android - 当我单击 android 日历列表视图中的重置按钮时如何清除选定的日期范围
- android - 无法在android中以编程方式通过intent打开PDF文件
- model-view-controller - 如何在 .net 核心中访问数据库上下文表单视图
- google-bigquery - 在 Bigquery 中计算大量向量之间的成对余弦相似度
- ios - 如何在 xamarin.ios 中控制来自 Dependecy-service 的背景音频
- excel - VBA 单击并键入 XMLHTTP
- c# - 从 IIS 打印无法在作为本地 asp.net 连接的共享打印机上工作
- java - Java NotificationCompat 声音不响