【问题标题】:Write columns with unequal lengths to CSV将长度不等的列写入 CSV
【发布时间】:2018-09-28 23:11:31
【问题描述】:

我在 C# 中反序列化了具有以下数据结构的 JSON 文件

[DataContract]
public class SentimentData
{
    [DataMember(Name ="Column1")]
    public IEnumerable<string> Column1 { get; set; }

    [DataMember(Name ="Column-2")]
    public IEnumerable<string> Column2 { get; set; }
}

column1 的计数不等于column2 的计数。我只想基本上转储第一列中 column1 中的所有数据和第二列中 column2 中的数据。我尝试了以下但没有工作。

using (var writer = new StreamWriter(@"C:\test.csv"))
{
    var nr = column1data.Select(y => new { Column1= y }).ToList();
    //var nnr = column2data.Select(y => new { Column2 = y }).ToList();

    var csv = new CsvWriter(writer);
    csv.WriteRecords(nr);
    //csv.WriteRecords(nnr);
    writer.Flush();
}

有人知道怎么做吗?

示例 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"
  ]
}

【问题讨论】:

  • @Nkosi 我已经添加了示例 json。我需要格式为 Column1 |第 2 列。如果你在这里看到没有。 Column2 中的记录更大
  • @Nkosi 我只是为那些没有数据的列清空。基本上只是转储列
  • 那么@marsze 提供的链接看起来是您构建所需对象的解决方案,然后可以将其传递给 csv 编写器

标签: c# csvhelper


【解决方案1】:

以下代码的修改版本为默认Enumerable.Zip

派生以下扩展名以允许压缩不等长度的集合

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);
        }
    }
}

这将允许您构建所需的对象模型,然后可以将其写入 CSV 写入器

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();
}

【讨论】:

    【解决方案2】:

    试试 newtonsoft json.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; }
    }}
    

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 2015-09-09
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2021-09-02
      相关资源
      最近更新 更多