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

如何使用C#将CSV文件转换为Parquet格式

当然可以用C#实现CSV到Parquet格式的转换!.NET生态里有成熟的类库支持这个需求,下面我会一步步给你讲具体操作方法,附完整代码示例。

确认可行性

完全没问题!目前有两个非常流行的.NET库可以组合完成这个任务:

  • Parquet.Net:Apache Parquet官方推荐的.NET实现,专门用于读写Parquet文件
  • CsvHelper:处理CSV文件的高效工具,支持复杂的读取、映射逻辑
具体操作步骤

1. 安装必要的NuGet包

你可以通过Visual Studio的NuGet包管理器安装,或者用.NET CLI命令:

# 安装Parquet处理库
dotnet add package Parquet.Net
# 安装CSV读取库
dotnet add package CsvHelper

2. 定义数据模型(可选但推荐)

如果你的CSV有固定的表头和结构,先定义一个对应的数据类,方便后续映射。比如假设你的CSV内容是这样的:

Id,Name,Age,JoinDate
1,Alice,30,2020-01-15
2,Bob,25,2021-03-22

那么对应的模型类可以写:

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime JoinDate { get; set; }
}

3. 读取CSV并转换为Parquet

下面是完整的代码示例,包含读取CSV、写入Parquet的逻辑:

using System.Globalization;
using CsvHelper;
using Parquet;
using Parquet.Schema;

// 1. 定义Parquet的Schema(可以从模型类自动生成)
var parquetSchema = SchemaReflector.Reflect<Employee>();

// 2. 读取CSV文件
List<Employee> employees;
using (var reader = new StreamReader("employees.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    employees = csv.GetRecords<Employee>().ToList();
}

// 3. 将数据写入Parquet文件
using (var stream = File.OpenWrite("employees.parquet"))
{
    using (var parquetWriter = new ParquetWriter(parquetSchema, stream))
    {
        // 创建一个行组(Parquet文件由行组组成)
        using (var groupWriter = parquetWriter.CreateRowGroup())
        {
            // 将数据写入行组
            groupWriter.WriteTable(Table.FromRecords(employees));
        }
    }
}

4. 处理动态列(无固定模型的情况)

如果你的CSV结构不固定,也可以动态构建Parquet Schema,示例如下:

using CsvHelper;
using CsvHelper.Configuration;
using Parquet;
using Parquet.Data;

// 读取CSV的表头和数据
List<dynamic> csvData;
List<string> headers;
using (var reader = new StreamReader("dynamic.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    csv.Read();
    csv.ReadHeader();
    headers = csv.HeaderRecord.ToList();
    
    csvData = csv.GetRecords<dynamic>().ToList();
}

// 动态构建Parquet Schema
var fields = headers.Select(h => new DataField<string>(h)).ToList();
var parquetSchema = new Schema(fields);

// 转换数据并写入
using (var stream = File.OpenWrite("dynamic.parquet"))
{
    using (var writer = new ParquetWriter(parquetSchema, stream))
    {
        using (var groupWriter = writer.CreateRowGroup())
        {
            // 将动态数据转换为Parquet行
            foreach (var header in headers)
            {
                var values = csvData.Select(row => row[header].ToString()).ToList();
                groupWriter.WriteColumn(new DataColumn(parquetSchema.GetDataField(header), values));
            }
        }
    }
}
注意事项
  • 确保CSV的列类型和Parquet的类型匹配,比如日期列要正确解析,避免类型转换错误
  • 对于大文件,建议使用流式处理,避免一次性加载所有数据到内存
  • Parquet.Net支持压缩(默认是Snappy),可以通过ParquetWriter的配置调整压缩算法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:33:16