You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将特定结构CSV转换为图表控件所需的JSON格式?

问题描述

我需要将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的格式规则:最左侧列是时间,首行是表头(对应datalabel的内容)。我已经成功把CSV解析成了DataTable,但不知道怎么把DataTable转成上面要求的JSON结构。直接序列化DataTable得到的格式不符合要求,现在卡在了代码的后半部分(构建目标对象列表)。

我的当前代码:

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 = ?
                }
            };

        })             
            
    }
}
解决方案

调整DataTable的遍历逻辑即可,核心思路是:每行的第一列是时间,剩下的每一列对应一个datalabel(列名)和value(当前行该列的数值),具体修改如下:

  1. 先取出每行第一列的值作为time;
  2. 遍历除第一列外的所有列,用列名作为datalabel,将列值转为数值类型作为value;
  3. 直接创建符合目标结构的匿名对象,不需要嵌套VALS层级。

修改后的遍历代码:

// 替换原来的foreach循环
foreach(DataRow row in dt.Rows)
{
    // 获取当前行的时间(CSV第一列)
    string time = row[0].ToString();
    
    // 遍历除时间列外的所有数据列
    for(int i = 1; i < dt.Columns.Count; i++)
    {
        DataColumn col = dt.Columns[i];
        // 尝试将列值转为double类型(如果是整数可改用int.TryParse)
        if(double.TryParse(row[i].ToString(), out double value))
        {
            graphItems.Add(new
            {
                datalabel = col.ColumnName,
                time = time,
                value = value
            });
        }
    }
}

// 最后将列表序列化为JSON返回
return Json(graphItems, JsonRequestBehavior.AllowGet);

额外优化建议

  • 可以提前判断CSV列数是否≥2(时间列+至少一个数据列),避免空数据场景;
  • 如果CSV数值格式不规范,可增加异常处理逻辑;
  • 若使用.NET Core/.NET 5+,可去掉JsonRequestBehavior.AllowGet,直接写return Json(graphItems);。

内容的提问来源于stack exchange,提问作者Eli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:40:25