将json字符串写入一个.csv列

时间:2019-05-14 13:41:15

标签: c# json csv

我想将一个字符串写入.csv(Excel)文件的一列中。我的问题是该字符串被写入多个列。the string is written into multiple Columns

例如,在此屏幕截图中,我有20列。

        GetMetadataCompleteResponse resultValue = null;
        string jsonData = null;

        await Task.Run(() =>
        {
            byte[] rawData = Convert.FromBase64String(responseContent);
            jsonData = CompressUtil.Unzip(rawData);
        });

        resultValue = JsonConvert.DeserializeObject<GetMetadataCompleteResponse>(jsonData);

       foreach(string a in resultValue.Value.Values)
            {
                foreal += a;
            }
       await Log.Info("callWebservice for " + strUrl + ", Result: " + objErrorDetails.Code + ", " + foreal);

编辑

我注意到,新列在每个';'(分号)之后开始。我可能可以用其他东西代替它。

1 个答案:

答案 0 :(得分:1)

我认为您有2个问题。第一个是如何通过简单的字符串连接编写CSV。没有转义或双引号。 Json的逗号,将用CSV分隔。

为了产生有效的CSV,您应该阅读RFC 4180并使用适当的库来处理序列化。

这是在CSV列中编写Json的Minimal, Complete, and Verifiable example

using CsvHelper;
using CsvHelper.Configuration;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var input = new Foo
        {
            Label = "My Foo",
            Bars = new List<Bar> {
                new Bar{Label="Bar2"},
                new Bar{Label="Bar1"},
                new Bar{Label="Bar3"},
            }
        };

        var json = JsonConvert.SerializeObject(input);

        var myObject = new CsvObject
        {
            Label = "My CSV object",
            FooString = json,
        };

        var result = "";

        // Writing into a string instead of a file for debug purpuse. 
        using (var stream = new MemoryStream())
        using (var reader = new StreamReader(stream))
        using (var writer = new StreamWriter(stream))
        using (var csv = new CsvWriter(writer))
        {

            csv.Configuration.RegisterClassMap<CsvObjectMap>();

            csv.WriteHeader<CsvObject>();                
            csv.NextRecord();

            csv.WriteRecord(myObject);                
            csv.NextRecord();

            writer.Flush();
            stream.Position = 0;
            result = reader.ReadToEnd();
        }
        Console.WriteLine(result);
    }

    private sealed class CsvObjectMap : ClassMap<CsvObject>
    {
        public CsvObjectMap()
        {
            Map( m => m.FooString );
            Map( m => m.Label );
        }
    }
    public class CsvObject
    {
        public string Label { get; set; }
        public string FooString { get; set; }
    }
    public class Foo
    {
        public string Label { get; set; }
        public List<Bar> Bars { get; set; }
    }
    public class Bar
    {
        public string Label { get; set; }
    }
}

实时演示:https://dotnetfiddle.net/SNqZX1

在此示例中,我已将CsvHelper用于CSV序列化,并将Json.NET用于Json序列化。请注意,将CSV文件写入文件比将example

这样的字符串写入文件更简单