Maison >développement back-end >Tutoriel C#.Net >Une bibliothèque .NET pour les solutions techniques aux fichiers CSV : documentation chinoise CsvHelper
CsvHelper est une bibliothèque .NET permettant de lire et d'écrire des fichiers CSV. CsvHelper peut être téléchargé via le gestionnaire de packages de Visual Studio. Définition de mappage automatique : lorsqu'aucun fichier de mappage n'est fourni, la valeur par défaut est le mappage automatique et le mappage automatique sera mappé aux attributs de la classe dans l'ordre.
Adresse GitHub
var csv = new CsvReader( textReader ); var records = csv.GetRecords<MyClass>(); // 把 CSV 记录映射到 MyClass,返回的 records 是个 IEnumerable<T> 对象
Si vous souhaitez personnaliser la relation de mappage, vous pouvez voir la section de mappage ci-dessous.
Étant donné que les enregistrements sont un objet IEnumerable8742468051c85b06f0a0af9e3e506b5c, un enregistrement sera renvoyé uniquement lors d'un accès, et un enregistrement sera renvoyé une fois consulté. Si vous souhaitez y accéder comme une liste, vous pouvez procéder comme suit :
var csv = new CsvReader( textReader ); var records = csv.GetRecords<MyClass>().ToList();
Vous pouvez lire les données de chaque ligne dans une boucle de ligne
var csv = new CsvReader( textReader ); while( csv.Read() ) { var record = csv.GetRecord<MyClass>(); }
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" ); }
Si le type de lecture peut être différent de celui attendu, vous pouvez utiliser TryGetField
var csv = new CsvReader( textReader ); while( csv.Read() ) { int intField; if( !csv.TryGetField( 0, out intField ) ) { // Do something when it can't convert. } }
si vous voulez chaque Une ligne peut être renvoyée sous forme de chaîne à l'aide de CsvParser.
var parser = new CsvParser( textReader ); while( true ) { var row = parser.Read(); // row 是个字符串 if( row == null ) { break; } }
var csv = new CsvWriter( textWriter ); csv.WriteRecords( records );
var csv = new CsvWriter( textWriter ); foreach( var item in list ) { csv.WriteRecord( item ); }
var csv = new CsvWriter( textWriter ); foreach( var item in list ) { csv.WriteField( "a" ); csv.WriteField( 2 ); csv.WriteField( true ); csv.NextRecord(); }
Lorsqu'aucun fichier de mappage n'est fourni, la valeur par défaut est le mappage automatique, qui sera mappé aux attributs de la classe dans l'ordre. Si l'attribut est une classe personnalisée, il continuera à être renseigné selon les attributs de cette classe personnalisée. Si une référence circulaire se produit, le mappage automatique s'arrête.
Si le fichier CSV et la classe personnalisée ne correspondent pas exactement, vous pouvez définir une classe correspondante pour le gérer.
public sealed class MyClassMap : CsvClassMap<MyClass> { public MyClassMap() { Map( m => m.Id ); Map( m = > m.Name ); } }
Cet article a été traduit par tangyikejun
Si l'attribut est une classe personnalisée qui correspond à plusieurs colonnes du fichier CSV, vous pouvez utiliser la référence cartographie.
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 ); } }
Vous pouvez spécifier le mappage par indice de colonne
public sealed class MyClassMap : CsvClassMap<MyClass> { public MyClassMap() { Map( m => m.Id ).Index( 0 ); Map( m => m.Name ).Index( 1 ); } }
Vous pouvez également spécifier le mappage par nom de la colonne, cela nécessite que le fichier csv ait un enregistrement d'en-tête, c'est-à-dire que la première ligne enregistre le nom de la colonne
public sealed class MyClassMap : CsvClassMap<MyClass> { public MyClassMap() { Map( m => m.Id ).Name( "The Id Column" ); Map( m => m.Name ).Name( "The Name Column" ); } }
public sealed class MyClassMap : CsvClassMap<MyClass> { public MyClassMap() { Map( m => m.FirstName ).Name( "Name" ).NameIndex( 0 ); Map( m => m.LastName ).Name( "Name" ).NameIndex( 1 ); } }
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" ); } }
public sealed class MyClassMap : CsvClassMap<MyClass> { public MyClassMap() { Map( m => m.Id ).Index( 0 ).TypeConverter<MyIdConverter>(); } }
Le convertisseur par défaut gérera la plupart de la conversion de type, mais nous devrons parfois apporter quelques petites modifications. À ce stade, vous pouvez essayer d'utiliser la conversion de type facultative.
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" ); // 内容转换 } }
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. } ); } }
Des mappages peuvent être créés au moment de l'exécution.
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);
Cet article a été traduit par tangyikejun
// Default value csv.Configuration.AllowComments = false;
var generatedMap = csv.Configuration.AutoMap<MyClass>();
Cache pour lire et écrire dans TextReader ou TextWriter
// Default value csv.Configuration.BufferSize = 2048;
La ligne commentée ne sera pas chargée dans
// Default value csv.Configuration.Comment = '#';
enregistre le nombre d'octets actuellement lus. Configuration.Encoding doit être défini pour être cohérent avec le fichier CSV. Ce paramètre affectera la vitesse d’analyse.
// Default value csv.Configuration.CountBytes = false;
// Default value csv.Configuration.CultureInfo = CultureInfo.CurrentCulture;
// Default value csv.Configuration.Delimiter = ",";
S'il est activé, il sera lancé si le numéro de colonne change. CsvBadDataException
// Default value csv.Configuration.DetectColumnCountChanges = false;
// Default value csv.Configuration.Encoding = Encoding.UTF8;
// Default value csv.Configuration.HasHeaderRecord = true;
Si les espaces dans les noms de colonnes sont ignorés
// Default value csv.Configuration.IgnoreHeaderWhiteSpace = false;
S'il faut ignorer l'accès privé lors de la lecture et de l'écriture
// Default value csv.Configuration.IgnorePrivateAccessor = false;
Une exception s'est produite lors de la lecture Continuez la lecture par la suite
// Default value csv.Configuration.IgnoreReadingExceptions = false;
Ne pas utiliser de guillemets comme caractères d'échappement
// Default value csv.Configuration.IgnoreQuotes = false;
// Default value csv.Configuration.IsHeaderCaseSensitive = true;
Peut accéder au mappage de classes personnalisé
var myMap = csv.Configuration.Maps[typeof( MyClass )];
Utilisée pour rechercher des attributs personnalisés classes
// Default value csv.Configuration.PropertyBindingFlags = BindingFlags.Public | BindingFlags.Instance;
Cet article a été traduit par tang yi ke jun
La définition est utilisée pour échapper aux caractères d'échappement contenant des délimiteurs, des crochets ou des fins de ligne
// Default value csv.Configuration.Quote = '"';
S'il faut ajouter des guillemets pour tous les champs lors de l'écriture au format CSV. QuoteAllFields et QuoteNoFields ne peuvent pas être vrais en même temps.
// Default value csv.Configuration.QuoteAllFields = false;
QuoteAllFields et QuoteNoFields ne peuvent pas être vrais en même temps.
// Default value csv.Configuration.QuoteNoFields = false;
csv.Configuration.ReadingExceptionCallback = ( ex, row ) => { // Log the exception and current row information. };
Si le mappage de classe est utilisé, il doit être enregistré avant d'être réellement utilisé.
csv.Configuration.RegisterClassMap<MyClassMap>(); csv.Configuration.RegisterClassMap<AnotherClassMap>();
Si tous les champs sont vides, ils seront considérés comme des champs vides
// Default value csv.Configuration.SkipEmptyRecords = false;
Supprimer le vide caractères à la fin du contenu du champ.
// Default value csv.Configuration.TrimFields = false;
// Default value csv.Configuration.TrimHeaders = false;
// Unregister single map. csv.Configuration.UnregisterClassMap<MyClassMap>(); // Unregister all class maps. csv.Configuration.UnregisterClassMap();
// Default value csv.Configuration.WillThrowOnMissingField = true;
Les conversions de types sont le moyen utilisé par CsvHelper pour convertir des chaînes en types .NET (et vice versa).
Exception.Data["CsvHelper"] // Row: '3' (1 based) // Type: 'CsvHelper.Tests.CsvReaderTests+TestBoolean' // Field Index: '0' (0 based) // Field Name: 'BoolColumn' // Field Value: 'two'
Les objets DataReader sont écrits au format 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(); }
DataTable Objet écrit en 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(); } }
CSV vers 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 ); }
Articles associés :
Documentation chinoise de l'API jQuery EasyUI - Documentation Documentation_jquery
Vidéos associées :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!