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

在MVC C#中用JSON Ajax绑定饼图动态数据及CSV转数组问题

解决C# Ajax获取CSV数据绑定Highcharts饼图的问题

核心思路

Highcharts饼图需要键值对数组结构(例如 [{name: '等级名称', y: 数值}, ...]),所以要先把后端返回的CSV字符串解析成对象数组,再转换成饼图兼容的格式。

步骤1:编写CSV解析函数

先实现一个客户端CSV解析函数,将CSV字符串转成包含表头和数据的对象数组:

function parseCSV(csvString) {
    // 按换行分割行,过滤空行
    const lines = csvString.split('\n').filter(line => line.trim() !== '');
    if (lines.length === 0) return [];
    
    // 提取表头
    const headers = lines[0].split(',').map(header => header.trim());
    // 处理数据行
    const data = [];
    for (let i = 1; i < lines.length; i++) {
        const values = lines[i].split(',').map(val => val.trim());
        const row = {};
        headers.forEach((header, index) => {
            row[header] = values[index];
        });
        data.push(row);
    }
    return data;
}

步骤2:Ajax请求+数据转换+饼图渲染

结合Ajax流程,在获取到CSV数据后完成解析、格式转换,最终渲染饼图:

// 示例Ajax请求(替换为你的实际接口)
$.ajax({
    url: '/api/YourGradeDataApi',
    type: 'GET',
    success: function(csvData) {
        // 1. 解析CSV为对象数组
        const parsedData = parseCSV(csvData);
        if (parsedData.length === 0) {
            console.error('CSV数据为空或格式错误');
            return;
        }
        
        // 2. 转换为Highcharts饼图所需格式
        // 这里用GradeName作为分类名称,WeightLoaded作为数值(可替换为InvoiceAmount)
        const chartData = parsedData.map(item => ({
            name: item.GradeName,
            y: parseFloat(item.WeightLoaded) // 转成数值类型,Highcharts仅接受数字
        }));
        
        // 3. 初始化饼图
        Highcharts.chart('container', {
            chart: {
                type: 'pie'
            },
            title: {
                text: '等级重量分布统计'
            },
            series: [{
                name: '重量',
                data: chartData
            }]
        });
    },
    error: function(xhr) {
        console.error('请求失败:', xhr.statusText);
    }
});

特殊场景处理

如果CSV包含带逗号的字段(例如 "Grade A, Type 1"),上面的基础解析函数会出错,可使用增强版解析函数处理带引号的字段:

function parseCSVAdvanced(csvString) {
    const regex = /(?:^|,)(?:"([^"]*)"|([^,]*))/g;
    const lines = csvString.split('\n').filter(line => line.trim() !== '');
    const headers = [];
    let match;
    while ((match = regex.exec(lines[0])) !== null) {
        headers.push((match[1] || match[2]).trim());
    }
    
    const data = [];
    for (let i = 1; i < lines.length; i++) {
        const row = {};
        regex.lastIndex = 0;
        let index = 0;
        while ((match = regex.exec(lines[i])) !== null) {
            row[headers[index]] = (match[1] || match[2]).trim();
            index++;
        }
        data.push(row);
    }
    return data;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:42:19