Jadual Kandungan
读取
读取所有的记录
手动读取记录
读取单独的字段
解析
写入
写入所有记录
映射
自动映射
手动映射
引用映射
下标指定
列名指定
同名处理
默认值
类型转换
可选类型转换
ConvertUsing
运行时映射
配置
允许注释
缓存
注释
Byte 计数
Culture 信息
分割符
列数变化
编码
是否有头记录
忽略列名空格
忽略私有访问
忽略读取异常
忽略引号
列名是否大小写敏感
映射访问
属性绑定标记
Quote
所有字段加引号
所有字段不加引号
读取异常的回调
注册类映射
跳过空白记录
Trim 字段
Trim 列名
解绑类映射
空字段是否抛出异常
其他
查看异常信息
DataReader 与 DataTable
Rumah pembangunan bahagian belakang Tutorial C#.Net 技术解答CSV 文件的一个 .NET 库:CsvHelper 中文文档

技术解答CSV 文件的一个 .NET 库:CsvHelper 中文文档

Jul 27, 2018 am 11:32 AM
c# csv

CsvHelper 是读写 CSV 文件的一个 .NET 库。可以通过 Visual Studio 的包管理器下载 CsvHelper。自动映射定义:没有提供映射文件的情况下,默认为自动映射,自动映射会按顺序依次映射到类的属性中去。

GitHub 地址

读取

读取所有的记录

var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>(); // 把 CSV 记录映射到 MyClass,返回的 records 是个 IEnumerable<T> 对象
Salin selepas log masuk

如果想要自定义映射关系,可以看下面映射一节。
由于 records 是个 IEnumerable 对象,因此仅当访问的时候才会返回一个记录,访问一次就返回一个记录。如果想要想列表那样访问,可以作如下处理:

var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>().ToList();
Salin selepas log masuk

手动读取记录

可以按行循环读取每一行的数据

var csv = new CsvReader( textReader );
while( csv.Read() )
{
    var record = csv.GetRecord<MyClass>();
}
Salin selepas log masuk

读取单独的字段

var csv = new CsvReader( textReader );
while( csv.Read() )
{
    var intField = csv.GetField<int>( 0 );
    var stringField = csv.GetField<string>( 1 );
    var boolField = csv.GetField<bool>( "HeaderName" );
}
Salin selepas log masuk

如果读取的类型跟预期的可能会不同,那么可以用 TryGetField

var csv = new CsvReader( textReader );
while( csv.Read() )
{
    int intField;
    if( !csv.TryGetField( 0, out intField ) )
    {
        // Do something when it can&#39;t convert.
    }
}
Salin selepas log masuk

解析

想要每一行作为一个字符串返回可以使用 CsvParser 。

var parser = new CsvParser( textReader );
while( true )
{
    var row = parser.Read(); // row 是个字符串
    if( row == null )
    {
        break;
    }
}
Salin selepas log masuk

写入

写入所有记录

var csv = new CsvWriter( textWriter );
csv.WriteRecords( records );
Salin selepas log masuk
var csv = new CsvWriter( textWriter );
foreach( var item in list )
{
    csv.WriteRecord( item );
}
Salin selepas log masuk
var csv = new CsvWriter( textWriter );
foreach( var item in list )
{
    csv.WriteField( "a" );
    csv.WriteField( 2 );
    csv.WriteField( true );
    csv.NextRecord();
}
Salin selepas log masuk

映射

自动映射

没有提供映射文件的情况下,默认为自动映射,自动映射会按顺序依次映射到类的属性中去。如果属性是一个自定义类,那么会继续依次按照这个自定义类的属性进行填入。如果出现了循环引用,那么自动映射会停止。

手动映射

如果 CSV 文件和自定义的类并不是完全的匹配,那么可以定义一个匹配类来处理。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        Map( m => m.Id );
        Map( m = > m.Name );
    }
}
Salin selepas log masuk
本文由 tangyikejun 翻译

引用映射

如果属性是一个自定义类,对应于CSV文件的多个列,那么可以使用引用映射。

public sealed class PersonMap : CsvClassMap<Person>
{
    public PersonMap()
    {
        Map( m => m.Id );
        Map( m => m.Name );
        References<AddressMap>( m => m.Address );
    }
}

public sealed class AddressMap : CsvClassMap<Address>
{
    public AddressMap()
    {
        Map( m => m.Street );
        Map( m => m.City );
        Map( m => m.State );
        Map( m => m.Zip );
    }
}
Salin selepas log masuk

下标指定

可以通过列下标指定映射

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        Map( m => m.Id ).Index( 0 );
        Map( m => m.Name ).Index( 1 );
    }
}
Salin selepas log masuk

列名指定

也可以通过列名指定映射,这要求csv文件有一个头记录,也就是说第一行记录列名

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        Map( m => m.Id ).Name( "The Id Column" );
        Map( m => m.Name ).Name( "The Name Column" );
    }
}
Salin selepas log masuk

同名处理

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        Map( m => m.FirstName ).Name( "Name" ).NameIndex( 0 );
        Map( m => m.LastName ).Name( "Name" ).NameIndex( 1 );
    }
}
Salin selepas log masuk

默认值

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public override void MyClassMap()
    {
        Map( m => m.Id ).Index( 0 ).Default( -1 );
        Map( m => m.Name ).Index( 1 ).Default( "Unknown" );
    }
}
Salin selepas log masuk

类型转换

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        Map( m => m.Id ).Index( 0 ).TypeConverter<MyIdConverter>();
    }
}
Salin selepas log masuk

可选类型转换

默认的转换器会处理大部分的类型转换,但是有时候我们可能需要做一些小的改变,这个时候可以尝试是用可选类型转换。

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        Map( m => m.Description ).Index( 0 ).TypeConverterOption( CultureInfo.InvariantCulture ); // 
        Map( m => m.TimeStamp ).Index( 1 ).TypeConverterOption( DateTimeStyles.AdjustToUniversal ); // 时间格式转换
        Map( m => m.Cost ).Index( 2 ).TypeConverterOption( NumberStyles.Currency ); // 数值类型转换
        Map( m => m.CurrencyFormat ).Index( 3 ).TypeConverterOption( "C" );
        Map( m => m.BooleanValue ).Index( 4 ).TypeConverterOption( true, "sure" ).TypeConverterOption( false, "nope" ); // 内容转换
    }
}
Salin selepas log masuk

ConvertUsing

public sealed class MyClassMap : CsvClassMap<MyClass>
{
    public MyClassMap()
    {
        // 常数
        Map( m => m.Constant ).ConvertUsing( row => 3 );
        // 把两列聚合在一起
        Map( m => m.Aggregate ).ConvertUsing( row => row.GetField<int>( 0 ) + row.GetField<int>( 1 ) );
        // Collection with a single value.
        Map( m => m.Names ).ConvertUsing( row => new List<string>{ row.GetField<string>( "Name" ) } );
        // Just about anything.
        Map( m => m.Anything ).ConvertUsing( row =>
        {
            // You can do anything you want in a block.
            // Just make sure to return the same type as the property.
        } );
    }
}
Salin selepas log masuk

运行时映射

可以在运行时创建映射。

var customerMap = new DefaultCsvClassMap();

// mapping holds the Property - csv column mapping 
foreach( string key in mapping.Keys )
{
    var columnName = mapping[key].ToString();

    if( !String.IsNullOrEmpty( columnName ) )
    {
        var propertyInfo = typeof( Customer ).GetType().GetProperty( key );
        var newMap = new CsvPropertyMap( propertyInfo );
        newMap.Name( columnName );
        customerMap.PropertyMaps.Add( newMap );
    }
}

csv.Configuration.RegisterClassMap(CustomerMap);
Salin selepas log masuk
本文由 tangyikejun 翻译

配置

允许注释

// Default value
csv.Configuration.AllowComments = false;
Salin selepas log masuk

自动映射

var generatedMap = csv.Configuration.AutoMap<MyClass>();
Salin selepas log masuk

缓存

TextReader 或 TextWriter 中读写的缓存

// Default value
csv.Configuration.BufferSize = 2048;
Salin selepas log masuk

注释

被注释掉的那行不会被加载进来

// Default value
csv.Configuration.Comment = &#39;#&#39;;
Salin selepas log masuk

Byte 计数

记录当前读取了多少 Byte 了,需要设置 Configuration.Encoding 与 CSV 文件一致。这个设置会影响解析的速度。

// Default value
csv.Configuration.CountBytes = false;
Salin selepas log masuk

Culture 信息

// Default value
csv.Configuration.CultureInfo = CultureInfo.CurrentCulture;
Salin selepas log masuk

分割符

// Default value
csv.Configuration.Delimiter = ",";
Salin selepas log masuk

列数变化

如果开启,发现列数变化会抛出 CsvBadDataException

// Default value
csv.Configuration.DetectColumnCountChanges = false;
Salin selepas log masuk

编码

// Default value
csv.Configuration.Encoding = Encoding.UTF8;
Salin selepas log masuk

是否有头记录

// Default value
csv.Configuration.HasHeaderRecord = true;
Salin selepas log masuk

忽略列名空格

是否忽略列名中的空格

// Default value
csv.Configuration.IgnoreHeaderWhiteSpace = false;
Salin selepas log masuk

忽略私有访问

读写的时候是否忽略私有访问器

// Default value
csv.Configuration.IgnorePrivateAccessor = false;
Salin selepas log masuk

忽略读取异常

读取发生异常之后仍继续读取

// Default value
csv.Configuration.IgnoreReadingExceptions = false;
Salin selepas log masuk

忽略引号

不把引号作为转义符

// Default value
csv.Configuration.IgnoreQuotes = false;
Salin selepas log masuk

列名是否大小写敏感

// Default value
csv.Configuration.IsHeaderCaseSensitive = true;
Salin selepas log masuk

映射访问

可以对自定义的类映射进行访问

var myMap = csv.Configuration.Maps[typeof( MyClass )];
Salin selepas log masuk

属性绑定标记

用来寻找自定义类的属性

// Default value
csv.Configuration.PropertyBindingFlags = BindingFlags.Public | BindingFlags.Instance;
Salin selepas log masuk
本文由 tang yi ke jun 翻译

Quote

定义用来转义包含分隔符,括号或者行尾的转义符

// Default value
csv.Configuration.Quote = &#39;"&#39;;
Salin selepas log masuk

所有字段加引号

写入csv的时候是否对所有字段加引号。QuoteAllFields 和 QuoteNoFields 不能同时为 true 。

// Default value
csv.Configuration.QuoteAllFields = false;
Salin selepas log masuk

所有字段不加引号

QuoteAllFields 和 QuoteNoFields 不能同时为 true 。

// Default value
csv.Configuration.QuoteNoFields = false;
Salin selepas log masuk

读取异常的回调

csv.Configuration.ReadingExceptionCallback = ( ex, row ) =>
{
    // Log the exception and current row information.
};
Salin selepas log masuk

注册类映射

使用了类映射的话,需要进行注册才会被实际使用到。

csv.Configuration.RegisterClassMap<MyClassMap>();
csv.Configuration.RegisterClassMap<AnotherClassMap>();
Salin selepas log masuk

跳过空白记录

如果所有字段都是空的,就会被认为是空字段

// Default value
csv.Configuration.SkipEmptyRecords = false;
Salin selepas log masuk

Trim 字段

把字段内容收尾的空白字符删去。

// Default value
csv.Configuration.TrimFields = false;
Salin selepas log masuk

Trim 列名

// Default value
csv.Configuration.TrimHeaders = false;
Salin selepas log masuk

解绑类映射

// Unregister single map.
csv.Configuration.UnregisterClassMap<MyClassMap>();
// Unregister all class maps.
csv.Configuration.UnregisterClassMap();
Salin selepas log masuk

空字段是否抛出异常

// Default value
csv.Configuration.WillThrowOnMissingField = true;
Salin selepas log masuk

类型转换

类型转换是 CsvHelper 把字符串转换为 .NET 类型(以及反过来)的方法。

其他

查看异常信息

Exception.Data["CsvHelper"]

// Row: &#39;3&#39; (1 based)
// Type: &#39;CsvHelper.Tests.CsvReaderTests+TestBoolean&#39;
// Field Index: &#39;0&#39; (0 based)
// Field Name: &#39;BoolColumn&#39;
// Field Value: &#39;two&#39;
Salin selepas log masuk

DataReader 与 DataTable

DataReader 对象写入到 CSV

var hasHeaderBeenWritten = false;
while( dataReader.Read() )
{
    if( !hasHeaderBeenWritten )
    {
        for( var i = 0; i < dataReader.FieldCount; i++ )
        {
            csv.WriteField( dataReader.GetName( i ) );
        }
        csv.NextRecord();
        hasHeaderBeenWritten = true;
    }

    for( var i = 0; i < dataReader.FieldCount; i++ )
    {
        csv.WriteField( dataReader[i] );
    }
    csv.NextRecord();
}
Salin selepas log masuk

DataTable 对象写入到 CSV

using( var dt = new DataTable() )
{
    dt.Load( dataReader );
    foreach( DataColumn column in dt.Columns )
    {
        csv.WriteField( column.ColumnName );
    }
    csv.NextRecord();

    foreach( DataRow row in dt.Rows )
    {
        for( var i = 0; i < dt.Columns.Count; i++ )
        {
            csv.WriteField( row[i] );
        }
        csv.NextRecord();
    }
}
Salin selepas log masuk

CSV 转 DataTable

while( csv.Read() )
{
    var row = dt.NewRow();
    foreach( DataColumn column in dt.Columns )
    {
        row[column.ColumnName] = csv.GetField( column.DataType, column.ColumnName );
    }
    dt.Rows.Add( row );
}
Salin selepas log masuk

相关文章:

.net CsvHelper 2.0

jQuery EasyUI API 中文文档 - Documentation 文档_jquery

相关视频:

Ruby中文文档

Atas ialah kandungan terperinci 技术解答CSV 文件的一个 .NET 库:CsvHelper 中文文档. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
<🎜> obscur: Ekspedisi 33 - Cara mendapatkan pemangkin Chroma yang sempurna
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1677
14
Tutorial PHP
1278
29
Tutorial C#
1257
24
Direktori Aktif dengan C# Direktori Aktif dengan C# Sep 03, 2024 pm 03:33 PM

Panduan untuk Active Directory dengan C#. Di sini kita membincangkan pengenalan dan cara Active Directory berfungsi dalam C# bersama-sama dengan sintaks dan contoh.

Penjana Nombor Rawak dalam C# Penjana Nombor Rawak dalam C# Sep 03, 2024 pm 03:34 PM

Panduan untuk Penjana Nombor Rawak dalam C#. Di sini kita membincangkan cara Penjana Nombor Rawak berfungsi, konsep nombor pseudo-rawak dan selamat.

Paparan Grid Data C# Paparan Grid Data C# Sep 03, 2024 pm 03:32 PM

Panduan untuk Paparan Grid Data C#. Di sini kita membincangkan contoh cara paparan grid data boleh dimuatkan dan dieksport daripada pangkalan data SQL atau fail excel.

Faktorial dalam C# Faktorial dalam C# Sep 03, 2024 pm 03:34 PM

Panduan untuk Faktorial dalam C#. Di sini kita membincangkan pengenalan kepada faktorial dalam c# bersama-sama dengan contoh dan pelaksanaan kod yang berbeza.

Perbezaan antara multithreading dan asynchronous C# Perbezaan antara multithreading dan asynchronous C# Apr 03, 2025 pm 02:57 PM

Perbezaan antara multithreading dan asynchronous adalah bahawa multithreading melaksanakan pelbagai benang pada masa yang sama, sementara secara tidak sengaja melakukan operasi tanpa menyekat benang semasa. Multithreading digunakan untuk tugas-tugas yang berintensifkan, sementara asynchronously digunakan untuk interaksi pengguna. Kelebihan multi-threading adalah untuk meningkatkan prestasi pengkomputeran, sementara kelebihan asynchronous adalah untuk tidak menghalang benang UI. Memilih multithreading atau asynchronous bergantung kepada sifat tugas: tugas-tugas intensif pengiraan menggunakan multithreading, tugas yang berinteraksi dengan sumber luaran dan perlu menyimpan respons UI menggunakan asynchronous.

Corak dalam C# Corak dalam C# Sep 03, 2024 pm 03:33 PM

Panduan kepada Corak dalam C#. Di sini kita membincangkan pengenalan dan 3 jenis Corak teratas dalam C# bersama-sama dengan contoh dan pelaksanaan kodnya.

Nombor Perdana dalam C# Nombor Perdana dalam C# Sep 03, 2024 pm 03:35 PM

Panduan Nombor Perdana dalam C#. Di sini kita membincangkan pengenalan dan contoh nombor perdana dalam c# bersama dengan pelaksanaan kod.

Cara menukar format XML Cara menukar format XML Apr 03, 2025 am 08:42 AM

Terdapat beberapa cara untuk mengubah format XML: mengedit secara manual dengan editor teks seperti Notepad; Memformat secara automatik dengan alat pemformatan XML dalam talian atau desktop seperti XMLBeAutifier; Tentukan peraturan penukaran menggunakan alat penukaran XML seperti XSLT; atau menghuraikan dan beroperasi menggunakan bahasa pengaturcaraan seperti Python. Berhati -hati apabila mengubahsuai dan membuat sandaran fail asal.

See all articles