首页 > 解决方案 > 在 SSIS 中读取具有 JSON 列的 csv 文件?

问题描述

我有以下包含 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""}"

标签: jsonsql-servercsvssisetl

解决方案


您可以使用脚本组件将 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. 这是负载。确保将文本限定符定义为双引号 (")

推荐阅读