C# Csv 操作

C# Csv 操作

下载

API

Example

实例小结 描述
Prerequisites 这些是.NET基础知识(流的使用和释放/文件读取和写入)
Reading 读取Csv
Writing 写入Csv
Configuration 配置Csv Helper的行为以使用Csv数据或自定义类结构
Type Conversion 使用类型转换将CSV字段转换为.NET类型和从.NET类型转换CSV字段
CsvDataReader 使用数据表读取CSV数据。

快速开始

读一个文件

/**
* 包含变标题的csv文件 file.csv
* Id,Name
* 1,one
* 2,two
*/

// 一个类定义
public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// 类属性名称与CSV文件头名称匹配,我们可以在不进行任何配置的情况下读取文件。
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    var records = csv.GetRecords<Foo>();
}
/**
* 不包含变标题的csv文件 file.csv
* 1,one
* 2,two
*/

// 首先,我们需要使用配置告诉读取器没有头记录。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    HasHeaderRecord = false,
};
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, config))
{
    var records = csv.GetRecords<Foo>();
}

// 一个类定义使用属性映射
// 索引属性允许您指定CSV字段要用于属性的位置。
public class Foo
{
    [Index(0)]
    public int Id { get; set; }

    [Index(1)]
    public string Name { get; set; }
}

// 也可以使用上面 使用名称映射位置
public class Foo
{
    [Name("id")]
    public int Id { get; set; }

    [Name("name")]
    public string Name { get; set; }
}
// 将Csv 数据填充 表单
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    // Do any configuration to `CsvReader` before creating CsvDataReader.
    using (var dr = new CsvDataReader(csv))
    {		
        var dt = new DataTable();
        dt.Load(dr);
    }
}
// 指定表单行列类型
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    // Do any configuration to `CsvReader` before creating CsvDataReader.
    using (var dr = new CsvDataReader(csv))
    {		
        var dt = new DataTable();
        dt.Columns.Add("Id", typeof(int));
        dt.Columns.Add("Name", typeof(string));

        dt.Load(dr);
    }
}
// 使用 Enumerate 
void Main()
{
    using (var reader = new StreamReader("path\\to\\file.csv"))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        var record = new Foo();
        var records = csv.EnumerateRecords(record);
        foreach (var r in records)
        {
            // r是与记录相同的实例。
        }
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

写一个文件

// 定义一个类结构
public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// 初始化 类结构列表
var records = new List<Foo>
{
    new Foo { Id = 1, Name = "one" },
    new Foo { Id = 2, Name = "two" },
};

// 将其写入文件
using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteRecords(records);
}
// 定义一个类映射结构
public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id).Index(0).Name("id");
        Map(m => m.Name).Index(1).Name("name");
    }
}

// 写入每一行数据
using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteHeader<Foo>();
    csv.NextRecord();
    foreach (var record in records)
    {
        csv.WriteRecord(record);
        csv.NextRecord();
    }
}

以下是一个简单的Csv解析插件

using System;
using System.Collections;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class CsvHelper
{
    /// <summary>
    /// 字符串是否包含奇数个引号
    /// </summary>
    /// <param name="str">相关字符串</param>
    /// <returns></returns>
    private static bool _isOddDoubleQuota(string str)
    {
        return _getDoubleQuotaCount(str) % 2 == 1;
    }
    private static int _getDoubleQuotaCount(string str)
    {
        string[] strArray = str.Split('"');
        int doubleQuotaCount = strArray.Length - 1;
        doubleQuotaCount = doubleQuotaCount < 0 ? 0 : doubleQuotaCount;
        return doubleQuotaCount;
    }

    /// <summary>
    /// 从字符串解析 Csv
    /// </summary>
    /// <param name="csvInfo"></param>
    /// <returns></returns>
    public static Dictionary<int, List<string>> AnalysisCsvByStr(string csvInfo)
    {
        Dictionary<int, List<string>> csvInfoDic = new Dictionary<int, List<string>>();
        Regex regex = new Regex(@"\r\n");
        string[] infoLines = regex.Split(csvInfo);
        int Rows = 0;
        for (int i = 0; i < infoLines.Length; i++)
        {
            if (string.IsNullOrEmpty(infoLines[i]))
            {
                continue;
            }
            string[] lineInfoArray = infoLines[i].Split(',');
            List<string> rowItemList = new List<string>();
            string strTemp = string.Empty;
            for (int j = 0; j < lineInfoArray.Length; j++)
            {
                strTemp += lineInfoArray[j];
                if (_isOddDoubleQuota(strTemp))
                {
                    if (j != lineInfoArray.Length - 1)
                    {
                        strTemp += ",";
                    }
                }
                else
                {
                    if (strTemp.StartsWith("\"") && strTemp.EndsWith("\""))
                    {
                        strTemp = strTemp.Substring(1, strTemp.Length - 2);
                    }
                    rowItemList.Add(strTemp);
                    strTemp = string.Empty;
                }
            }
            csvInfoDic.Add(Rows++, rowItemList);
        }

        return csvInfoDic;
    }

    /// <summary>
    /// 从文件解析Csv
    /// </summary>
    /// <param name="csvPath"></param>
    /// <returns></returns>
    public static Dictionary<int, List<string>> AnalysisCsvByFile(string csvPath)
    {
        if (File.Exists(csvPath))
        {
            string csvInfo = File.ReadAllText(csvPath, Encoding.UTF8);
            return AnalysisCsvByStr(csvInfo);
        }
        else
        {
            throw new FileNotFoundException("未找到文件:" + csvPath);
        }
    }
}
posted @ 2023-03-21 11:52  镜子-眼泪  阅读(771)  评论(0)    收藏  举报