【问题标题】:Read a csv file that has a JSON column in SSIS?在 SSIS 中读取具有 JSON 列的 csv 文件?
【发布时间】:2020-02-22 22:50:41
【问题描述】:

我有以下包含 4 列的 CSV 文件。最后一列addresses 以 JSON 格式保存 2 个地址历史记录。我曾尝试在 SSIS 中读取它,但它会将 JSON 与逗号 (,) 一起拆分,而不是将所有地址分组在一列下。

我为此使用了平面文件连接器。此类内容是否还有其他源组件?如何在 SSIS 中解析它,以便只有 4 列,地址全部显示在一列下?

id,title,name,addresses
J44011,Mr,James,"{""address_line_1"": 45, ""post_code"": ""XY7 10PG""},{""address_line_1"": 15, ""post_code"": ""AB7 1HG""}"

【问题讨论】:

  • 你可以使用 c# nuget 包吗?
  • 我建议将其全部加载到单个列中并在 SQL Server 中解析。
  • @Charles 我刚刚意识到 SSIS 脚本组件不允许我导入和保留 Nuget 引用包。关闭并重新打开后,引用就消失了。
  • 我会解析脚本组件中的地址列并加载到地址表中。我为此提供了答案。

标签: json sql-server csv ssis etl


【解决方案1】:

您可以使用脚本组件将 JSON 处理为自己的详细信息表。

我创建了以下数据流:

以下是脚本组件的步骤:

在输入时添加 ID 和地址列:

关于输入和输出:添加新输出并创建列(记得对数据类型进行编程:

脚本:

public class Addresses
{
    public int address_line_1 { get; set; }
    public string post_code { get; set; }
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    //Test if addresses exist, if not leave the Row processing
    if (string.IsNullOrEmpty(Row.addresses)) return;        

    //Fix Json to make it an array of objects
    string json = string.Format("[{0}]", Row.addresses);

    //Load into an array of Addressses
    Addresses[] adds = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Addresses[]>(json);

    //Process the array
    foreach (var a in adds)
    {
        rowsAddressesBuffer.AddRow();
        rowsAddressesBuffer.ID = Row.id;
        rowsAddressesBuffer.Address1 = a.address_line_1;
        rowsAddressesBuffer.PostalCode = a.post_code;
    }
}

注意事项:

  1. 添加到存储结果的类。
  2. 必须修复 JSON 才能创建对象数组。
  3. 您需要添加对 System.Web.Extensions 的引用。
  4. 这将用于负载。确保将文本限定符定义为双引号 (")

【讨论】:

  • @ibexy 这个答案被接受的方式很奇怪,因为它与您的问题无关!!!!!!
  • @Yahfoufi 答案是详细的分步说明,不仅回答了问题,而且继续实施我正在寻找的解决方案。这里缺少的细节是将平面文件源组件中的“文本限定符”设置为双引号。
【解决方案2】:

我尝试在 SSIS 中读取它,但它沿逗号 (,) 拆分 JSON,而不是将所有地址分组在一列下。

为了强制 SSIS 读取 4 列中的平面文件行,您应该打开平面文件连接管理器,转到高级选项卡,然后只添加 4 列。确保最后一列长度等于 4000。这将强制读取第 4 列而不拆分它。

将数据导入 SQL Server 后,可以使用 OPENJSON() 函数解析 JSON 内容

【讨论】:

  • 您忘记在双引号上标记文本限定符。这就是为什么它分成一个额外的列。这样做还可以修复字符串中的双双引号。
  • @KeithL 你是对的。但默认情况下它会识别这一点。您可以从上面的屏幕截图中看到,因为列 TextQualified 属性设置为 True
  • 我认为 OP 改变了他的问题以更好地适应您的答案。当我回答是关于如何处理第 4 列中的 Json 时。
  • @KeithL 你是对的。一旦我输入了双引号限定符,一切正常。
  • @KeithL 如果 JSON 不包含行分隔符 ({CR}{LF}),即使不设置文本限定符,这也可以工作
猜你喜欢
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多