csv 到 json 文件格式

csv to json file format

我想使用 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 列为 null 时将其替换为 []。所以我期望的输出是:

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

有人知道怎么做吗?

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

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

使用外部库 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());

示例 fiddle: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());

示例 fiddle:https://dotnetfiddle.net/gOX3FJ

输出:

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

希望对您有所帮助。