您当前的位置: 首页 >  json

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Cinchoo ETL——将JSON数组值合并到单个CSV列

寒冰屋 发布时间:2022-05-16 21:07:19 ,浏览量:0

目录

1、介绍

2. 要求

3. 使用方法

3.1 样本数据

3.2 快速转换

3.3 使用POCO对象

3.4 使用投影

3.5 使用选择

  • 下载 Cinchoo ETL 源码
  • 下载 Cinchoo ETL 二进制文件 (.NET Core)
  • 下载 Cinchoo ETL 二进制文件 (.NET Framework)
1、介绍

ChoETL是一个用于.NET的开源ETL(提取、转换和加载)框架。它是一个基于代码的库,用于在.NET环境中从多个来源提取数据、转换并加载到您自己的数据仓库中。您可以立即在数据仓库中拥有数据。

这个技巧讨论了使用Cinchoo ETL框架从JSON格式生成CSV文件。使用非常简单,只需几行代码,即可完成转换。您可以转换大文件,因为转换过程是基于流的、速度非常快且内存占用低。

2. 要求

该框架库是使用.NET 4.5 / .NET Core Frameworks用C#编写的。

3. 使用方法 3.1 样本数据

让我们首先看一个转换以下JSON输入文件的简单示例。

清单 3.1.1 示例JSON数据输入文件(Emp.json)

{
  "id": 2,
  "name": "I.1.A.2",
  "activeFlag": true,
  "recipients": [ "idenity1", "idenity2" ]
}

由于JSON消息是分层结构格式,因此您必须扁平化才能生成CSV文件。上面的'recipients'是一个JSON数组,需要转换为单个CSV列,如下所示。此外,这些值需要通过以下方式分隔:

清单 3.1.2 CSV数据输出文件(Emp.csv)

id,name,activeFlag,recipients
2,I.1.A.2,True,idenity1;idenity2

首先要做的是安装ChoETL.JSON/ChoETL.JSON.NETStandard nuget包。为此,请在包管理器控制台中运行以下命令。

.NET Framwork

Install-Package ChoETL.JSON

.NET Core

Install-Package ChoETL.JSON.NETStandard

现在ChoETL向程序添加命名空间。

using ChoETL;
3.2 快速转换

这种方法展示了如何用一小段代码将JSON文件转换为CSV格式。不需要设置/POCO类。

清单 3.2.1 快速JSON到CSV文件转换

private static void QuickConversion()
{
    StringBuilder csv = new StringBuilder();

    using (var r = ChoJSONReader.LoadText(json))
    {
        using (var w = new ChoCSVWriter(csv)
            .WithFirstLineHeader()
            .UseNestedKeyFormat(false)
            .Configure(c => c.ArrayValueSeparator = ';')
            )
        {
            w.Write(r);
        }
    }
    Console.WriteLine(csv.ToString());
}

创建一个用于读取emp.json文件的ChoJSONReader对象实例。然后使用以下配置设置创建一个用于生成CSV (emp.csv)文件的ChoCSVWriter实例:

  • UseNestedKeyFormat(false)——告诉CSV编写器不要在数组/集合字段上使用嵌套键格式。这将触发组合集合值。
  • Configure(c => c.ArrayValueSeparator = ';')——告诉CSV编写器在组合集合/数组值时使用指定的分隔符。

示例fiddle:C# Online Compiler | .NET Fiddle

3.3 使用POCO对象

这种方法向您展示了如何定义POCO实体类并将它们用于转换过程。这种方法类型更安全,并且对转换过程进行了精细控制。使用json值填充对象后,使用LINQ为所需的CSV格式组合数据。

清单 3.3.1 映射类

public class Emp
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool ActiveFlag { get; set; }
    public string[] Recipients { get; set; }
}

然后使用这个类如下进行文件的转换。

清单 3.3.2 使用POCO对象将JSON转换为CSV文件

private static void UsingPOCO()
{
    StringBuilder csv = new StringBuilder();

    using (var r = ChoJSONReader.LoadText(json)
        )
    {
        using (var w = new ChoCSVWriter(csv)
            .WithFirstLineHeader()
            .UseNestedKeyFormat(false)
            .Configure(c => c.ArrayValueSeparator = ';')
            )
        {
            w.Write(r);
        }
    }
    Console.WriteLine(csv.ToString());
}

fiddle示例:C# Online Compiler | .NET Fiddle

3.4 使用投影

此方法展示了如何使用LINQ投影方法将JSON文件转换为CSV文件。您可能知道,JSON是一种分层的、关系的和结构化的数据,而CSV不是。如果您有从JSON读取器以分层格式生成的对象,则必须使用LINQ投影展平并将它们提供给CSV写入器以创建CSV文件。下面的示例显示了如何做到这一点。

清单 3.4.1 使用投影将JSON转换为CSV文件

private static void UsingProjection()
{
    StringBuilder csv = new StringBuilder();

    using (var r = ChoJSONReader.LoadText(json)
        )
    {
        using (var w = new ChoCSVWriter(csv)
            .WithFirstLineHeader()
            )
        {
            w.Write(r.Select(r1 =>
            {
                return new
                {
                    r1.id,
                    r1.name,
                    r1.activeFlag,
                    recipients = String.Join(";", r1.recipients)
                };
            }
            ));
        }
    }
    Console.WriteLine(csv.ToString());
}

fiddle示例:C# Online Compiler | .NET Fiddle

3.5 使用选择

该方法展示了如何使用选择方法结合展平节点将JSON文件转换为CSV文件。您可能知道,JSON是一种分层的、关系的和结构化的数据,而CSV不是。当您的JSON很复杂时,这种方法很有用,您想使用JSONPath挑选项目以生成预期的CSV文件。下面的示例显示了如何做到这一点。

清单 3.5.1 示例JSON数据输入文件(Emp.json)

{
  "id": 2,
  "name": "I.1.A.2",
  "activeFlag": true,
  "recipients": [
    {
      "id": 3,
      "identityName": "idenity1",
      "fullName": "FullName1"
    },
    {
      "id": 4,
      "identityName": "identity2",
      "fullName": "FullName2"
    }
  ]
}

清单 3.5.2 使用Selection将JSON转换为CSV文件

private static void UsingSelection()
{
    StringBuilder csv = new StringBuilder();

    using (var r = ChoJSONReader.LoadText(json)
        .WithField("id")
        .WithField("name")
        .WithField("activeFlag")
        .WithField("recipients", jsonPath: "$..recipients[*]..identityName")
        )
    {
        using (var w = new ChoCSVWriter(csv)
            .WithFirstLineHeader()
            .UseNestedKeyFormat(false)
            .Configure(c => c.ArrayValueSeparator = ';')
            )
        {
            w.Write(r);
        }
    }
    Console.WriteLine(csv.ToString());
}

fiddle示例:C# Online Compiler | .NET Fiddle

https://www.codeproject.com/Tips/5312832/Cinchoo-ETL-Merging-JSON-Array-Values-to-Single-CS

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0641s