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": []
}
]
希望对您有所帮助。
我想使用 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": []
}
]
希望对您有所帮助。