将长度不等的列写入 CSV
Write columns with unequal lengths to CSV
我在 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; }
}
第 1 列的计数不等于第 2 列的计数。我只想基本上转储第一列中 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"
]
}
试试 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; }
}}
以下为默认代码的修改版本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();
}
我在 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; }
}
第 1 列的计数不等于第 2 列的计数。我只想基本上转储第一列中 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"
]
}
试试 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; }
}}
以下为默认代码的修改版本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();
}