在 SSIS 中读取具有 JSON 列的 csv 文件?

Read a csv file that has a JSON column in SSIS?

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

您可以使用脚本组件将 JSON 处理成它自己的细节 table。

我创建了以下数据流:

脚本组件的步骤如下:

在输入中添加 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. class 添加到存储结果。
  2. 必须修复 JSON 才能创建对象数组。
  3. 您需要添加对 System.Web.Extensions 的引用。
  4. 这会去加载。确保文本限定符定义为双引号 (")

I have tried to read it in SSIS but it splits the JSON along the comma(,) instead of grouping all the addresses under one column.

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

导入数据到SQL服务器后,可以使用OPENJSON()函数解析JSON内容