CsvHelper ist eine .NET-Bibliothek zum Lesen und Schreiben von CSV-Dateien. CsvHelper kann über den Paketmanager von Visual Studio heruntergeladen werden. Automatische Zuordnungsdefinition: Wenn keine Zuordnungsdatei bereitgestellt wird, ist die Standardeinstellung die automatische Zuordnung, und die automatische Zuordnung wird der Reihe nach den Attributen der Klasse zugeordnet.
GitHub-Adresse
var csv = new CsvReader( textReader ); var records = csv.GetRecords<MyClass>(); // 把 CSV 记录映射到 MyClass,返回的 records 是个 IEnumerable<T> 对象
Wenn Sie die Zuordnungsbeziehung anpassen möchten, können Sie den Zuordnungsabschnitt unten sehen.
Da es sich bei „records“ um ein IEnumerable
var csv = new CsvReader( textReader ); var records = csv.GetRecords<MyClass>().ToList();
Sie können die Daten jeder Zeile in einer Zeilenschleife lesen
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" ); }
vom erwarteten abweicht, können Sie TryGetField
var csv = new CsvReader( textReader ); while( csv.Read() ) { int intField; if( !csv.TryGetField( 0, out intField ) ) { // Do something when it can't convert. } }
zu analysieren, wenn Sie möchten, dass jede Zeile als Zeichenfolge zurückgegeben wird. Sie können CsvParser verwenden.
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 ); }
Wenn keine Zuordnungsdatei bereitgestellt wird, ist die Standardeinstellung „Automatisch“. Bei der Zuordnung wird die automatische Zuordnung den Attributen der Klasse der Reihe nach zugeordnet. Handelt es sich bei dem Attribut um eine benutzerdefinierte Klasse, wird es weiterhin entsprechend den Attributen dieser benutzerdefinierten Klasse ausgefüllt. Wenn ein Zirkelverweis auftritt, stoppt die automatische Zuordnung.
Wenn die CSV-Datei und die benutzerdefinierte Klasse nicht genau übereinstimmen, können Sie eine passende Klasse definieren, um damit umzugehen.
var csv = new CsvWriter( textWriter ); foreach( var item in list ) { csv.WriteField( "a" ); csv.WriteField( 2 ); csv.WriteField( true ); csv.NextRecord(); }
Dieser Artikel wurde von tangyikejun übersetzt
Wenn das Attribut eine benutzerdefinierte Klasse ist, die mehreren Spalten der CSV-Datei entspricht, können Sie die Referenzzuordnung verwenden.
public sealed class MyClassMap : CsvClassMap<MyClass> { public MyClassMap() { Map( m => m.Id ); Map( m = > m.Name ); } }
Sie können die Zuordnung nach Spaltenindex angeben
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 ); } }
Sie können die Zuordnung auch nach Spaltennamen angeben erfordert csv Die Datei verfügt über einen Header-Datensatz, das heißt, die erste Zeile zeichnet den Spaltennamen auf
public sealed class MyClassMap : CsvClassMap<MyClass> { public MyClassMap() { Map( m => m.Id ).Index( 0 ); Map( m => m.Name ).Index( 1 ); } }
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" ); } }
Der Standardkonverter übernimmt den größten Teil der Typkonvertierung, aber manchmal müssen wir möglicherweise einige kleine Änderungen vornehmen. Zu diesem Zeitpunkt können wir versuchen, die optionale Typkonvertierung zu verwenden .
public sealed class MyClassMap : CsvClassMap<MyClass> { public MyClassMap() { Map( m => m.Id ).Index( 0 ).TypeConverter<MyIdConverter>(); } }
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" ); // 内容转换 } }
Zuordnungen können zur Laufzeit erstellt werden.
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. } ); } }
Dieser Artikel wurde übersetzt von tangyikejun
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);
// Default value csv.Configuration.AllowComments = false;
TextReader Oder der Lese- und Schreibcache in TextWriter
var generatedMap = csv.Configuration.AutoMap<MyClass>();
Die auskommentierte Zeile wird nicht in
// Default value csv.Configuration.BufferSize = 2048;
Datensatz geladen Der aktuelle Lesevorgang. Wie viele Bytes wurden abgerufen? Configuration.Encoding muss so eingestellt werden, dass es mit der CSV-Datei übereinstimmt. Diese Einstellung wirkt sich auf die Geschwindigkeit des Parsens aus.
// Default value csv.Configuration.Comment = '#';
// Default value csv.Configuration.CountBytes = false;
// Default value csv.Configuration.CultureInfo = CultureInfo.CurrentCulture;
Wenn aktiviert, wird eine CsvBadDataException ausgelöst, wenn die Änderung der Spaltennummer gefunden wird
// Default value csv.Configuration.Delimiter = ",";
// Default value csv.Configuration.DetectColumnCountChanges = false;
// Default value csv.Configuration.Encoding = Encoding.UTF8;
Ob Leerzeichen in Spaltennamen ignoriert werden
// Default value csv.Configuration.HasHeaderRecord = true;
Ob private Accessoren beim Lesen und Schreiben ignoriert werden sollen
// Default value csv.Configuration.IgnoreHeaderWhiteSpace = false;
Weiterlesen, nachdem beim Lesen eine Ausnahme auftritt
// Default value csv.Configuration.IgnorePrivateAccessor = false;
Verwenden Sie keine Anführungszeichen als Escape-Zeichen
// Default value csv.Configuration.IgnoreReadingExceptions = false;
// Default value csv.Configuration.IgnoreQuotes = false;
Sie können auf benutzerdefinierte Klassen zugreifen Zuordnungen
// Default value csv.Configuration.IsHeaderCaseSensitive = true;
Wird zum Suchen von Attributen benutzerdefinierter Klassen verwendet
var myMap = csv.Configuration.Maps[typeof( MyClass )];
Dieser Artikel wurde von tang yi ke jun übersetzt
Definieren Sie das Escape-Zeichen, das verwendet wird, um Trennzeichen, Klammern oder Zeilenenden zu maskieren.
// Default value csv.Configuration.PropertyBindingFlags = BindingFlags.Public | BindingFlags.Instance;
Gibt an, ob beim Schreiben in CSV alle Felder in Anführungszeichen gesetzt werden sollen. QuoteAllFields und QuoteNoFields können nicht gleichzeitig wahr sein.
// Default value csv.Configuration.Quote = '"';
QuoteAllFields und QuoteNoFields können nicht gleichzeitig wahr sein.
// Default value csv.Configuration.QuoteAllFields = false;
// Default value csv.Configuration.QuoteNoFields = false;
Wenn Klassenzuordnung verwendet wird, muss sie registriert werden, bevor sie tatsächlich verwendet wird.
csv.Configuration.ReadingExceptionCallback = ( ex, row ) => { // Log the exception and current row information. };
Wenn alle Felder leer sind, werden sie als leere Felder betrachtet
csv.Configuration.RegisterClassMap<MyClassMap>(); csv.Configuration.RegisterClassMap<AnotherClassMap>();
Fügen Sie dem Feldinhalt Leerzeichen am Ende hinzu werden gelöscht.
// Default value csv.Configuration.SkipEmptyRecords = false;
// 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();
Typ Konvertierungen sind die Methode von CsvHelper zum Konvertieren von Zeichenfolgen in .NET-Typen (und umgekehrt).
// Default value csv.Configuration.WillThrowOnMissingField = true;
DataReader-Objekt wird in CSV geschrieben
Exception.Data["CsvHelper"] // Row: '3' (1 based) // Type: 'CsvHelper.Tests.CsvReaderTests+TestBoolean' // Field Index: '0' (0 based) // Field Name: 'BoolColumn' // Field Value: 'two'
DataTable-Objekt wird geschrieben 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(); }
CSV zu DataTable
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(); } }
Verwandte Artikel:
jQuery EasyUI API Chinesische Dokumentation - Documentation Documentation_jquery
Ähnliche Videos:
Ruby Chinesische Dokumentation
Das obige ist der detaillierte Inhalt vonEine .NET-Bibliothek für technische Lösungen für CSV-Dateien: CsvHelper chinesische Dokumentation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!