从json创建csv文件,每个记录具有不同的标头值

时间:2016-11-10 20:53:42

标签: c# json export-to-csv

我有一个非常嵌套的大型json文件。我需要根据某个字段的名称编写多个csv文件,如果它存在,则将值添加到我创建的标题中(如果它没有创建新标题)。这工作得很好。但是我遇到了标题不匹配的问题,因为该特定标题对于该记录不存在。例如:

Header:  Dog   Cat  Mouse  Horse
Record1:  yes   yes  yes   yes
上面的

//是包含所有值的文件的示例 添加记录2,其中标题值未全部列出

Header:  Dog   Cat  Mouse  Horse
Record1:  yes   yes  yes   yes
Record2:  yes   yes  yes   ***

上面的Record2在记录中没有鼠标,但因为它没有排列是左移的是。在将值吐出到文件之前,我需要在头下写一个Null。下面是我的代码,如果你可以提供帮助,那就太好了,因为我在这一点上输了:

        static List<string> headList = new List<string>();
        static List<string> newHeaderList = new List<string>();
        static List<string> valueList = new List<string>();
        static List<string> oldHeadList = new List<string>();
        static void Main()
        {
            var data = JsonConvert.DeserializeObject<dynamic>(File.ReadAllText(
                          @"C:\Users\nphillips\workspace\2016R23\UITestAutomation\SeedDataGenerator\src\staticresources\seeddata.resource"));
            string fileName = "";
            var bundles = data.RecordSetBundles;

            foreach (var bundle in bundles)
            {
                var records = bundle.Records;
                foreach (var record in records)
                {
                    var test = record.attributes;
                    foreach (var testagain in test)
                    {
                        // Getting the object Name Ex. Location, Item, etc.
                        var jprop = testagain as JProperty;
                        if (jprop != null)
                        {
                            fileName = jprop.First.ToString().Split('_')[2] + ".csv";
                        }
                        break;
                    }
                    string header = "";
                    string value = "";
                    foreach (var child in record)
                    {
                        var theChild = child as JProperty;
                        if (theChild != null && !theChild.Name.Equals("attributes"))
                        {
                            // adding the name and values to list
                            headList.Add(child.Name);
                            valueList.Add(child.Value.ToString());
                        }
                    }
                    // calling method to write columns and values
                    writeCSV(headList, valueList, fileName);
                    valueList.Clear();
                    headList.Clear();
                }
            }
        }

        public static void writeCSV(List<string> headList, List<string> valList, string fileName)
        {
            string headerString = "";
            string value = "";

            if (!File.Exists(fileName))
            {
                foreach (var header in headList)
                {
                    foreach (var val in valList)
                    {
                        value += val + ",";
                    }
                    oldHeadList.Add(header);
                    headerString += header + ',';
                }

                headerString += "+" + Environment.NewLine;
                File.WriteAllText(fileName, headerString);
            }
            else
            {
                foreach (var header in headList)
                {
                    foreach (var oldHeader in oldHeadList)
                    {
                        foreach (var val in valList)
                        {
                            if (header != oldHeader)
                            {
                                value += "null,";
                            }
                            else
                            {
                                value += val + ",";
                            }
                        }

                    }
                }
            }
            File.AppendAllText(fileName, value);
            value += Environment.NewLine;
        }
    }

我可怕的json文件,我无法更改为我公司使用的文件:https://codeshare.io/rGL6K5

2 个答案:

答案 0 :(得分:0)

有某种模式吗? 我要问的原因是,也许你可以创建一个将JSON序列化为复杂对象的服务。完成后,有一个服务将该对象序列化为csv。该服务将知道根据需要编写多个csv文件。

答案 1 :(得分:0)

如果JSON有可靠的模式,我就不会使用{dynamic}。我获取了一个示例JSON文件,将其复制到剪贴板并使用Visual Studio中的粘贴JSON到类功能。

https://blogs.msdn.microsoft.com/webdev/2012/12/18/paste-json-as-classes-in-asp-net-and-web-tools-2012-2-rc/

之后,使用Newtonsoft.JSON将其反序列化为一个可靠的对象,从中构建CSV。