将csv文件转换为json,它具有连续两个列并且具有多行]

问题描述 投票:-2回答:1

我有一个csv文件,在一行中有两列具有多个值。我想将其转换为列表

示例:CSV数据

Id     name      parentid
1       sam         12-george
                    24-jennifer

Json数据

[{id:1,name:sam,parentid:[{id:12,name:george},{id:24,name:jennifer}]}]]

c#
1个回答
0
投票
class Program
{
    const string CSV =
        @"Id     name      parentid
        1       sam         12-george
                            24-jennifer";

    static void Main(string[] args)
    {
        var csvArray = new JArray();

        // Split to lines
        string[] lines = CSV.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

        // Ignore header line
        JArray currentParentArray = null;
        for (int i = 1; i < lines.Length; i++)
        {
            string[] items = lines[i].Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
            if (items.Length == 3)
            {
                var line = new JObject();
                csvArray.Add(line);

                line["id"] = int.Parse(items[0]);
                line["name"] = items[1];

                currentParentArray = new JArray();
                line["parentid"] = currentParentArray;

                ParseParentId(items[2], currentParentArray);
            }

            if (items.Length == 1 && currentParentArray != null)
                ParseParentId(items[0], currentParentArray);
        }

        var ser = JsonSerializer.CreateDefault();

        string json = csvArray.ToString();
        Console.WriteLine(json);
        Console.ReadKey();
    }

    static void ParseParentId(string parentId, JArray parentArray)
    {
        int idx = parentId.IndexOf("-");
        string id = parentId.Substring(0, idx);
        string name = parentId.Substring(1 + idx);

        var obj = new JObject();
        obj["id"] = int.Parse(id);
        obj["name"] = name;

        parentArray.Add(obj);
    }
}

此C#源应该可以工作。如果在下一行仅包含另一个parentid,则在行之间记住parentid的数组并将其添加到该数组中。

向Newtonsoft.Json添加Nuget引用进行编译。

© www.soinside.com 2019 - 2024. All rights reserved.