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

C#读取含JSON格式数据的特殊CSV文件方法咨询

高效提取CSV中嵌套JSON并转换为MachineData对象的方案

核心思路

你的CSV属于单行列嵌套JSON的特殊格式:第一列是日期,第二列是跨多行的JSON字符串。高效处理的关键是:

  • 正确识别CSV的行边界(避免被JSON内的换行分割)
  • 解析JSON字符串时处理格式瑕疵(比如你提供的JSON末尾有多余的逗号,会导致解析失败)
  • 直接将JSON映射到已定义的MachineData类,避免手动字段映射

步骤1:正确读取CSV(以Java为例)

普通按行读取会因JSON内的换行出错,推荐使用支持引号包裹内容的CSV解析库,比如OpenCSV,它能自动识别双引号包裹的跨多行内容。

依赖配置(Maven)

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.6</version>
</dependency>

读取代码

import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public class CsvProcessor {
    public static void main(String[] args) throws Exception {
        List<MachineData> machineDataList = new ArrayList<>();
        
        // 读取CSV,自动处理双引号包裹的跨多行内容
        try (CSVReader reader = new CSVReaderBuilder(new FileReader("your-machine-data.csv"))
                .withSkipLines(0) // 无表头填0,有表头填1
                .build()) {
            String[] row;
            while ((row = reader.readNext()) != null) {
                // 处理行号(如果CSV包含示例中的1.、2.前缀)
                String date = row[0].substring(row[0].indexOf(" ") + 1);
                String jsonStr = row[1];
                
                // 解析JSON并转换为MachineData对象
                MachineData data = parseJsonToMachineData(jsonStr);
                machineDataList.add(data);
            }
        }
        
        // 这里可以将machineDataList存入你需要的存储对象
    }
}

步骤2:解析JSON并映射到MachineData类

使用Jackson库直接将JSON字符串转换为MachineData对象,同时配置忽略JSON末尾的多余逗号,避免解析失败。

依赖配置(Maven)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

解析代码

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

private static MachineData parseJsonToMachineData(String jsonStr) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    // 忽略JSON末尾的多余逗号,避免解析报错
    mapper.configure(DeserializationFeature.FAIL_ON_TRAILING_TOKENS, false);
    // 直接映射到MachineData类
    return mapper.readValue(jsonStr, MachineData.class);
}

MachineData类要求

确保类字段与JSON键匹配,或通过@JsonProperty指定映射,且必须包含无参构造函数(Jackson解析需要):

public class MachineData {
    private long timestamp;
    private int machineId;
    private int status;
    private boolean isActive;
    private double scanWidth;
    
    public MachineData() {}
    
    // Getter、Setter方法(可使用Lombok简化)
    // ...
}

效率优化建议

  • 复用ObjectMapper:ObjectMapper创建成本高,全局复用一个实例,不要每次解析都新建
  • 流式处理:若CSV数据量极大,改用逐行读取+流式JSON解析,避免一次性加载所有数据到内存
  • 预处理JSON格式:批量处理前提前去除JSON末尾的多余逗号,减少解析时的配置开销

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:50:27