在 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;
}
}
备注:
- class 添加到存储结果。
- 必须修复 JSON 才能创建对象数组。
- 您需要添加对 System.Web.Extensions 的引用。
- 这会去加载。确保文本限定符定义为双引号 (")
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内容
我有以下包含 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;
}
}
备注:
- class 添加到存储结果。
- 必须修复 JSON 才能创建对象数组。
- 您需要添加对 System.Web.Extensions 的引用。
- 这会去加载。确保文本限定符定义为双引号 (")
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内容