【问题标题】:csv to json file formatcsv转json文件格式
【发布时间】:2019-01-15 15:08:53
【问题描述】:

我想使用 c# 将我的 csv 文件转换为 .json 格式。这是我尝试过的:

var lines = @"text,intentName,entityLabels
        1,2,null
        2,1,null".Replace("\r", "").Split('\n');

    var csv = lines.Select(l => l.Split(',')).ToList();

    var headers = csv[0];
    var dicts = csv.Skip(1).Select(row => Enumerable.Zip(headers, row, 
Tuple.Create).ToDictionary(p => p.Item1, p => p.Item2)).ToArray();

    string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(dicts);
    Result1.Text = json;

结果是:

[
 {
"text":" 1",
"intentName":"2",
"entityLabels":"null"
},
 {
"text":"2",
"intentName":"1",
"entityLabels":"null"
}
] 

这几乎和我预期的一样,但是如果 entityLabels 列为空,我想将其替换为 []。所以我期望的输出是:

[
 {
"text":" 1",
"intentName":"2",
"entityLabels":[]
},
 {
"text":"2",
"intentName":"1",
"entityLabels":[]
}
] 

有人知道怎么做吗?

【问题讨论】:

  • 空数组仍然是数组,而不是null 值。如果要为缺少的entityLabels 生成一个空数组,则必须用数组替换空值
  • BTW JavaScriptSerializer 是一个不应使用的过时类。它是近十年前创建的,使用不再有效的约定,例如日期。最流行的库是 JSON.NET。甚至 ASP.NET Web API 和 ASP.NET Core 项目都可以开箱即用地使用它
  • 这适用于当前示例,但它将如何处理给定的 entityLabels 数据。它在 csv 中会是什么样子?

标签: c# json csv choetl


【解决方案1】:

使用外部库Cinchoo ETL - 一个开源库,您可以将 CSV --> JSON 转换为预期格式,如下所示

方法一:

string csv = @"text,intentName,entityLabels
1,2,null
2,1,null
";

StringBuilder sb = new StringBuilder();
using (var p = ChoCSVReader.LoadText(csv)
    .WithFirstLineHeader()
    .WithField("text")
    .WithField("intentName")
    .WithField("entityLabels", fieldType: typeof(int[]), nullValue: "null")
    )
{
    using (var w = new ChoJSONWriter(sb)
        )
        w.Write(p);
}

Console.WriteLine(sb.ToString());

小提琴样例:https://dotnetfiddle.net/5M7fFX

方法二:

string csv = @"text,intentName,entityLabels
1,2,null
2,1,null
";

StringBuilder sb = new StringBuilder();
using (var p = ChoCSVReader.LoadText(csv)
    .WithFirstLineHeader()
    .WithField("text")
    .WithField("intentName")
    .WithField("entityLabels", valueConverter: (o) => new int[] { })
    )
{
    using (var w = new ChoJSONWriter(sb)
        )
        w.Write(p);
}

Console.WriteLine(sb.ToString());

小提琴样例:https://dotnetfiddle.net/gOX3FJ

输出:

[
 {
  "text": "1",
  "intentName": "2",
  "entityLabels": []
 },
 {
  "text": "2",
  "intentName": "1",
  "entityLabels": []
 }
]

希望对你有帮助。

【讨论】:

  • 你能解释一下 ChoJSONWriter 吗?它来自哪里?我使用 ChoETL,但在任何地方都找不到 ChoJSONWriter。我还需要创建其他代码吗?
  • 安装 ChoETL.JSON nuget 包
【解决方案2】:

不要尝试使用字符串操作将一种数据类型转换为另一种数据类型。

改为使用实际的 CSV 解析库,如 csvhelper(在 NuGet 上可用)将 CSV 反序列化为对象,然后使用 JSON 序列化程序将相同的数据重新序列化为 JSON。

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 2018-08-15
    • 1970-01-01
    • 2013-07-23
    • 2018-03-06
    • 2019-08-15
    • 2023-02-07
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多