将CSV文件转换为JSON格式

zzoitvuj  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(95)

我正在努力将CSV文件转换为JSON格式(用于图表控件)。
我需要的JSON数据格式如下:

var dataRetrievedfromCSV = [
    {
        "datalabel": "Humidity",
        "time": "1:54",
        "value": 78.4
    },
    {
        "datalabel": "Temperature",
        "time": "1:00",
        "value": 9.2
    },
    {
        "datalabel": "Temperature",
        "time": "2:12",
        "value": 16.4
    },
    {
        "datalabel": "Humidity",
        "time": "2:30",
        "value": 78.2
      }
    ];

CSV的格式是,时间在最左边的列,而标题信息(标签)在最上面的一行。(截图如下)

我在解析CSV时遇到了麻烦,在这种情况下,头部随时间而变化,同时包含所有值。
以下是我的当前代码:

public ActionResult GraphResults(string filePathT, int testNumber)
    {
        string filePath = filePathT;
        DataTable dt = new DataTable();
        TextReader reader = new StreamReader(filePath);
        List<object> graphItems = new List<object>();

        using (TextFieldParser parser = new TextFieldParser(filePath))
        {
            parser.TextFieldType = FieldType.Delimited;
            parser.SetDelimiters(",");
            bool firstRow = true;
            while (!parser.EndOfData)
            {
                string[] currentRow = parser.ReadFields();

                if (firstRow) //check for header row
                {
                    foreach (string fields in currentRow)
                    {
                        dt.Columns.Add(fields, typeof(string));
                    }

             
                    continue;
                }

                //Create new data rows under header

                DataRow dr = dt.NewRow();
                dt.Rows.Add(dr);

                for (int c = 0; c < currentRow.Count(); c++)
                {
                    dr[c] = currentRow[c];
                }
               

            }
        }

         //once we have the datatable, attempt to organize for CSV?
         foreach(DataRow row in dt.Rows)
        {
            foreach(DataColumn col in dt.Columns)
            {
                graphItems.Add(new
                {
                    VALS = new
                    {
                        datalabel = ?,
                        time = ?,
                        value = ?
                    }
                };

            })             
                
        }
}

我成功地将CSV转换成了C#中的数据表,但我仍然(在代码的第二部分)在创建正确格式的JSON对象时遇到了麻烦。
graphItems是一个List,但我对任何组织/创建JSON格式的方法都持开放态度。
我试过简单地将整个数据表序列化为JSON,但这失败了,因为返回的格式不包括标签,或每个数据点的时间。

hsgswve4

hsgswve41#

您可能应该将数据转换为对象而不是数据网格。这有助于确保数据的有效性:

public class Foo
{
    public DateTime TestTime{ get; set; }
    public int State { get; set; }
    ...
}

为了解析csv文件,你可能应该使用一个库,比如CsvHelper

using (var reader = new StreamReader("myFile.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    var records = csv.GetRecords<Foo>();
}

您可能需要配置读取器,以便使用索引或列标题名称将列Map到属性。看起来还有两行标题,因此可能需要读取第一行来忽略它。阅读文档了解详细信息。
然后,您可以为要导出的值创建类:

public class Bar{
    public string datalabel {get;set;}
    public double value {get;set;}
    ...
    public Bar(Foo foo){
        datalabel = foo.datalabel;
        value = foo.value;
    }
}

并Map所有对象:

var bars = records.Select(r => new Bar(r)).ToList();

最后使用一些库(如system.text.json)序列化对象列表

string jsonString = JsonSerializer.Serialize(bars);

相关问题