欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net解析csv(C#导表工具)

程序员文章站 2022-03-15 21:20:40
前言 解析Excel有知名的NPOI库,(Java语言是POI),但是NPOI是不支持解析csv的。 csv本质上也是文本文件,可以进行差异对比,更利于解决冲突。 本文对解析csv的几个.net的开源库进行调研 很小巧简单的库:https://github.com/stevehansen/csv/ ......

前言

解析excel有知名的npoi库,(java语言是poi),但是npoi是不支持解析csv的。

csv本质上也是文本文件,可以进行差异对比,更利于解决冲突。

本文对解析csv的几个.net的开源库进行调研

性能测试

本次性能测试结果来自:.net core中的csv解析库

当测试100000行数据的时候

.net解析csv(C#导表工具)

当测试1000000行数据的时候

.net解析csv(C#导表工具)

从测试结果上看
tiny csv parser的效率比csvhelper高很多,内存占用也少很多。

最终结论
当不需要支持字符串换行的时候,请使用tiny csv parser
当需要支持字符串换行的时候,请使用csvhelper

测试csv

第二行中有人为换行符,在tiny csv 和 csv中会解析不出来,而csvhelper则可以

make model comment
内容1 内容2 这是一个换行,
的内容
内容2-1 内容2-1 单行注释

csvhelper示例

如果要读取某行的原始数据,基本内容是在 csvreader.context 字段

public static void parsecsvdemo(string filepath)
{
    csvreader csvreader = null;
    using (filestream filestream = new filestream(filepath, filemode.open, fileaccess.read))
    {
        using (streamreader reader = new streamreader(filestream, encoding.getencoding("gb2312")))
        {
            csvreader = new csvreader(reader);
            //设置之后,不读取第一列,且列数也会减少
//                    csvreader.configuration.hasheaderrecord = false;

            int rowcount = 0;
            while (csvreader.read())
            {
                //列数
                var columncount = csvreader.context.record.length;
                //每行的原始数据
                var raw = csvreader.context.rawrecord;
                rowcount = rowcount + 1;
                if (rowcount == 2)
                {
                    var filename = csvreader.getfield<string>(2);
                    console.writeline("输出名:{0}", filename);
                }
                console.writeline("行:{0} ,列:{1},内容:{2}", rowcount, columncount, raw);
            }
        }
    }
}

注:对于csvhelper提供的映射关系(把表的一行数据结构转成 class类型),我未使用到,因为我们主要是提取表的数据。

使用情景

使用c#开发的导表工具,可以导出excel和csv,支持把excel数据插入到sql数据库,且excel的格式可以自定义。

这个项目已开源,可参考我之前的文章:

tableml excel编译/解析工具

tableml-gui篇(c# 编译/解析 excel/csv工具)

遇到问题

问题:未能加载文件或程序集,或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配

解决方案: 使用nuget更新使用到的库或者检查库所依赖的.net framework版本和项目的基于的.net framework版本是否一致。