C# 将长度不等的列写入CSV
我用C语言反序列化了一个JSON文件,其数据结构如下# 谁能知道怎么做吗 示例json:C# 将长度不等的列写入CSV,c#,csvhelper,C#,Csvhelper,我用C语言反序列化了一个JSON文件,其数据结构如下# 谁能知道怎么做吗 示例json: { "Negative": [ "a.txt", "b.txt", "a.txt", "b.txt", "a.txt", "b.txt" ], "Non-Negative": [ "a.txt", "b.txt", "a.txt", "b.txt", "a.txt", "b.txt", "a.
{
"Negative": [
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt"
],
"Non-Negative": [
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt",
"a.txt",
"b.txt"
]
}
试试newtonsoftjson.net 像这样安装它
install-package newtonsoft.json
这对我很有用:
static class Program
{
static void Main()
{
var json = "{ \"Negative\": [ \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\" ], \"Non-Negative\": [ \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\" ] }";
var classObject = JsonConvert.DeserializeObject<RootObject>(json);
}
}
public class RootObject
{
public List<string> Negative { get; set; }
[JsonProperty("Non-Negative")]
public List<string> NonNegative { get; set; }
}}
静态类程序
{
静态void Main()
{
“a.txt”、“a.txt”、“a.txt”、“b.txt”、“b.txt”、“b.txt”、“b.txt”、“b.txt”、“a.txt”、“a.txt”、“a.txt”、“b.txt”、“b.txt”以及“b.txt”等;若若“非负面”金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属金属b.txt\“,”a.txt\“,”b.txt\“,”a.txt\“,”b.txt\“,”a.txt\“,”b.txt\“,”a.txt\“,”b.txt\“]}”;
var classObject=JsonConvert.DeserializeObject(json);
}
}
公共类根对象
{
公共列表负{get;set;}
[JsonProperty(“非负”)]
公共列表非负{get;set;}
}}
以下是默认代码的修改版本
以下扩展是为了允许压缩长度不等的集合而派生的
public static class MyEnumerablExtensions {
public static IEnumerable<TResult> ZipOrDefault<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector) {
if (first == null) throw Error.ArgumentNull("first");
if (second == null) throw Error.ArgumentNull("second");
if (resultSelector == null) throw Error.ArgumentNull("resultSelector");
using (IEnumerator<TFirst> e1 = first.GetEnumerator()) {
using (IEnumerator<TSecond> e2 = second.GetEnumerator()) {
while (e1.MoveNext()) {
if (e2.MoveNext()) {
yield return resultSelector(e1.Current, e2.Current);
} else {
yield return resultSelector(e1.Current, default(TSecond));
}
}
while (e2.MoveNext()) {
yield return resultSelector(default(TFirst), e2.Current);
}
}
}
}
class Error {
public static Exception ArgumentNull(string parameter) {
return new ArgumentNullException(parameter);
}
}
}
可能会有帮助:@Nkosi我已经添加了示例json。我需要的格式是Column1 | Column2。如果你看到这里,Column2中的记录数是bigger@Nkosi我只是为那些没有数据的列清空。基本上,jsut转储列@marsze提供的链接看起来是您构建所需对象的解决方案,然后可以将该对象传递给csv writer还有一个
static class Program
{
static void Main()
{
var json = "{ \"Negative\": [ \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\" ], \"Non-Negative\": [ \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\" ] }";
var classObject = JsonConvert.DeserializeObject<RootObject>(json);
}
}
public class RootObject
{
public List<string> Negative { get; set; }
[JsonProperty("Non-Negative")]
public List<string> NonNegative { get; set; }
}}
public static class MyEnumerablExtensions {
public static IEnumerable<TResult> ZipOrDefault<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector) {
if (first == null) throw Error.ArgumentNull("first");
if (second == null) throw Error.ArgumentNull("second");
if (resultSelector == null) throw Error.ArgumentNull("resultSelector");
using (IEnumerator<TFirst> e1 = first.GetEnumerator()) {
using (IEnumerator<TSecond> e2 = second.GetEnumerator()) {
while (e1.MoveNext()) {
if (e2.MoveNext()) {
yield return resultSelector(e1.Current, e2.Current);
} else {
yield return resultSelector(e1.Current, default(TSecond));
}
}
while (e2.MoveNext()) {
yield return resultSelector(default(TFirst), e2.Current);
}
}
}
}
class Error {
public static Exception ArgumentNull(string parameter) {
return new ArgumentNullException(parameter);
}
}
}
using (var writer = new StreamWriter(@"C:\test.csv")) {
var records = column1data.ZipOrDefault(column2data,
(Column1, Column2) => new { Column1, Column2 });
var csv = new CsvWriter(writer);
csv.WriteRecords(records);
writer.Flush();
}