visual-studio - 将平面文件导入 SSIS 会出现问题,因为分隔符不一致
问题描述
我在将平面文件导入 SSIS 时遇到问题。
文件由“|”分隔 并且分隔符为“;;”。但是分隔符不一致。有时,在行和行中,只有“;” 或无 ””。导入到 SSIS 时,我得到了结果
Column 1 Column 2 Column 3 Column 4 Column 5
a b c d e;|a1|b1|c1|d1|e1
这应该看起来像
Column 1 Column 2 Column 3 Column 4 Column 5
a b c d e
a1 b1 c1 d1 e1
问题出现了,因为在第一行中只有一个或没有“;”。注意这是一个例子,许多行是正确的并且有“;;” 作为分隔符。我只是指出问题所在。
.csv 文件看起来像
Column 1|Column 2|Column 3|Column 4|Column 5;;
a|b|c|d|e;
a1|b1|c1|d1|e1;;
而应该看起来像
Column 1|Column 2|Column 3|Column 4|Column 5;;
a|b|c|d|e;;
a1|b1|c1|d1|e1;;
数据集非常大,有近 600.000 行和 50 列。
我面临的第一个问题是导入文件时,因为 SSIS 标准 DataType 读取是string [DT_STR]
. 长度为50
. 由于有时有多行带有错误的分隔符,所以我在最后一列单元格中得到了一个很长的字符串。我使用 Visual Studio,并在高级编辑器中将长度更改为非常大的长度。
所以问题是,我如何在 SSIS 和 Visual Studio Community 中将某些单元格中的值分隔在一列中,并将它们拆分为一个全新的行(使用已经定义的列变量)。
我已尝试手动查找所有出现错误的情况,并在 .csv 文件中进行了更改。在此 SSIS 工作之后。然而,这不是一个持久的解决方案,因为我每个月都会收到一个新文件。
我尝试阅读以下建议:
但他们的问题不一样,因为他们有一个复制的列值,我想要一个全新的行。
谢谢你的帮助,ss
!!编辑尝试使用 J Weezy 和 RM 的答案:!!
我尝试创建一个脚本任务并遵循该解决方案。
在 Visual Studio 中,我使用脚本组件添加脚本任务,然后选择“转换”。在输入列下,我选择全部。
在此之后,我将平面文件源定向到脚本组件并运行代码。像这样运行脚本(脚本组件不做任何事情)可以工作。
然后我在脚本组件中输入“编辑脚本”,然后在public override void Input0_ProcessInputRow(Input0Buffer Row)
我下输入(使用 RM 的帮助):
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
public static string[] SplitLine(string input)
{
Regex lineSplit = new Regex("[0-9]\;$", RegexOptions.Compiled);
List<string> list = new List<string>();
string curr = null;
foreach (Match match in lineSplit.Matches(input))
{
curr = match.Value;
if (0 == curr.Length)
{
list.Add("");
}
list.Add(curr.TrimStart(';'));
}
return list.ToArray();
}
}
但是这不起作用(我什至不允许执行任务)。
我以前从未使用过 c#,所以一切对我来说都是新的。据我了解代码,它搜索每一行以找到只有一个“;”前面有数字的模式 最后,因此它不会找到那些以“;;”后面的数字结尾的行 (二 ;)。当有匹配时,一个“;” 被添加。
请让我知道,我不理解和做错了什么。
也许将脚本组件放在平面文件源之后也是错误的,因为添加了“;” 不会导致新行,这就是我想要的。
解决方案
不一致的行分隔符是错误数据,在连接管理器或数据流中确实没有办法纠正这个问题。修复数据流中的错误数据并不是 SSIS 的设计目的。您最好的选择是执行以下两项操作之一:
- 与数据源提供商合作,最终解决问题
- 创建脚本任务首先修改文件以纠正不良数据
从那里,您将能够在 SSIS 中正常处理文件。
更新1:
如果 唯一的问题是重复的分隔符 (;;),则读入该行并使用该Replace(";;",";");
函数。如果您有多个重复或无效的行尾分隔符,那么最好使用StringBuilder()
. 有关使用的解决方案StringBuilder()
,请参阅下面的网络链接。
https://stackoverflow.com/a/49949787/4630376
更新 2:
我刚刚记得的一件事是,假设双引号作为文本限定符存在于文件中,您将需要调整以仅处理双引号之外的那些字符。这很重要,因为如果没有它,您将删除引号内的任何字符,这可能是有效数据。
推荐阅读
- mysql - MySQL INSERT INTO ON DUPLICATE KEY UPDATE 非连续 id
- python - 我如何按 ID 分组并相互添加列
- python - 按方法值过滤 - SQL 变量过多错误
- arrays - 使用 JSON 文件,我将如何使用 JQ 列出数组内的两个对象?
- docker - 使用 nvidia gpu 创建 docker-compose 时“不允许使用‘设备’属性”
- python - 将唯一组合放入文本文件并检测现有数据
- vb.net - 枚举错误错误。“在被宣布之前不能被提及”
- javascript - 使用 createWriteStream 节点向 JSON 文件中的数组添加值
- python - 在Python中用相同的数字计算每两行
- react-native - 启动隧道时出错 启动隧道超时