-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
29 changed files
with
545 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,196 @@ | ||
# Remove the line below if you want to inherit .editorconfig settings from higher directories | ||
root = true | ||
|
||
# C# files | ||
[*.cs] | ||
|
||
#### Core EditorConfig Options #### | ||
|
||
# Indentation and spacing | ||
indent_size = 4 | ||
indent_style = space | ||
tab_width = 4 | ||
|
||
# New line preferences | ||
end_of_line = crlf | ||
insert_final_newline = true | ||
|
||
#### .NET Coding Conventions #### | ||
|
||
# Organize usings | ||
dotnet_separate_import_directive_groups = true | ||
dotnet_sort_system_directives_first = true | ||
|
||
# this. and Me. preferences | ||
dotnet_style_qualification_for_event = false:silent | ||
dotnet_style_qualification_for_field = false:silent | ||
dotnet_style_qualification_for_method = false:silent | ||
dotnet_style_qualification_for_property = false:silent | ||
|
||
# Language keywords vs BCL types preferences | ||
dotnet_style_predefined_type_for_locals_parameters_members = true:warning | ||
dotnet_style_predefined_type_for_member_access = true:warning | ||
|
||
# Parentheses preferences | ||
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent | ||
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent | ||
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent | ||
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent | ||
|
||
# Modifier preferences | ||
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent | ||
|
||
# Expression-level preferences | ||
csharp_style_deconstructed_variable_declaration = true:suggestion | ||
csharp_style_inlined_variable_declaration = true:silent | ||
csharp_style_throw_expression = true:warning | ||
dotnet_style_coalesce_expression = true:error | ||
dotnet_style_collection_initializer = true:warning | ||
dotnet_style_explicit_tuple_names = true:error | ||
dotnet_style_null_propagation = true:error | ||
dotnet_style_object_initializer = true:silent | ||
dotnet_style_prefer_auto_properties = true:silent | ||
dotnet_style_prefer_compound_assignment = true:suggestion | ||
dotnet_style_prefer_conditional_expression_over_assignment = true:silent | ||
dotnet_style_prefer_conditional_expression_over_return = true:silent | ||
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion | ||
dotnet_style_prefer_inferred_tuple_names = true:suggestion | ||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion | ||
|
||
# Field preferences | ||
dotnet_style_readonly_field = true:suggestion | ||
|
||
# Parameter preferences | ||
dotnet_code_quality_unused_parameters = all:suggestion | ||
|
||
#### C# Coding Conventions #### | ||
|
||
# var preferences | ||
csharp_style_var_elsewhere = true:silent | ||
csharp_style_var_for_built_in_types = false:silent | ||
csharp_style_var_when_type_is_apparent = true:silent | ||
|
||
# Expression-bodied members | ||
csharp_style_expression_bodied_accessors = true:suggestion | ||
csharp_style_expression_bodied_constructors = true:suggestion | ||
csharp_style_expression_bodied_indexers = true:suggestion | ||
csharp_style_expression_bodied_lambdas = true:silent | ||
csharp_style_expression_bodied_local_functions = false:silent | ||
csharp_style_expression_bodied_methods = true:suggestion | ||
csharp_style_expression_bodied_operators = true:suggestion | ||
csharp_style_expression_bodied_properties = true:suggestion | ||
|
||
# Pattern matching preferences | ||
csharp_style_pattern_matching_over_as_with_null_check = true:warning | ||
csharp_style_pattern_matching_over_is_with_cast_check = true:warning | ||
|
||
# Null-checking preferences | ||
csharp_style_conditional_delegate_call = true:silent | ||
|
||
# Modifier preferences | ||
csharp_prefer_static_local_function = true:suggestion | ||
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async | ||
|
||
# Code-block preferences | ||
csharp_prefer_braces = true:error | ||
csharp_prefer_simple_using_statement = true:suggestion | ||
|
||
# Expression-level preferences | ||
csharp_prefer_simple_default_expression = true:error | ||
csharp_style_pattern_local_over_anonymous_function = true:suggestion | ||
csharp_style_prefer_index_operator = true:suggestion | ||
csharp_style_prefer_range_operator = true:suggestion | ||
csharp_style_unused_value_assignment_preference = discard_variable:suggestion | ||
csharp_style_unused_value_expression_statement_preference = discard_variable:silent | ||
|
||
# 'using' directive preferences | ||
csharp_using_directive_placement = outside_namespace:silent | ||
|
||
#### C# Formatting Rules #### | ||
|
||
# New line preferences | ||
csharp_new_line_before_catch = true | ||
csharp_new_line_before_else = true | ||
csharp_new_line_before_finally = true | ||
csharp_new_line_before_members_in_anonymous_types = true | ||
csharp_new_line_before_members_in_object_initializers = true | ||
csharp_new_line_before_open_brace = all | ||
csharp_new_line_between_query_expression_clauses = true | ||
|
||
# Indentation preferences | ||
csharp_indent_block_contents = true | ||
csharp_indent_braces = false | ||
csharp_indent_case_contents = true | ||
csharp_indent_case_contents_when_block = true | ||
csharp_indent_labels = one_less_than_current | ||
csharp_indent_switch_labels = true | ||
|
||
# Space preferences | ||
csharp_space_after_cast = false | ||
csharp_space_after_colon_in_inheritance_clause = true | ||
csharp_space_after_comma = true | ||
csharp_space_after_dot = false | ||
csharp_space_after_keywords_in_control_flow_statements = true | ||
csharp_space_after_semicolon_in_for_statement = true | ||
csharp_space_around_binary_operators = before_and_after | ||
csharp_space_around_declaration_statements = false | ||
csharp_space_before_colon_in_inheritance_clause = true | ||
csharp_space_before_comma = false | ||
csharp_space_before_dot = false | ||
csharp_space_before_open_square_brackets = false | ||
csharp_space_before_semicolon_in_for_statement = false | ||
csharp_space_between_empty_square_brackets = false | ||
csharp_space_between_method_call_empty_parameter_list_parentheses = false | ||
csharp_space_between_method_call_name_and_opening_parenthesis = false | ||
csharp_space_between_method_call_parameter_list_parentheses = false | ||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false | ||
csharp_space_between_method_declaration_name_and_open_parenthesis = false | ||
csharp_space_between_method_declaration_parameter_list_parentheses = false | ||
csharp_space_between_parentheses = false | ||
csharp_space_between_square_brackets = false | ||
|
||
# Wrapping preferences | ||
csharp_preserve_single_line_blocks = true | ||
csharp_preserve_single_line_statements = true | ||
|
||
#### Naming styles #### | ||
|
||
# Naming rules | ||
|
||
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion | ||
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface | ||
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i | ||
|
||
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion | ||
dotnet_naming_rule.types_should_be_pascal_case.symbols = types | ||
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case | ||
|
||
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion | ||
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members | ||
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case | ||
|
||
# Symbol specifications | ||
|
||
dotnet_naming_symbols.interface.applicable_kinds = interface | ||
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal | ||
dotnet_naming_symbols.interface.required_modifiers = | ||
|
||
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum | ||
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal | ||
dotnet_naming_symbols.types.required_modifiers = | ||
|
||
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method | ||
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal | ||
dotnet_naming_symbols.non_field_members.required_modifiers = | ||
|
||
# Naming styles | ||
|
||
dotnet_naming_style.pascal_case.required_prefix = | ||
dotnet_naming_style.pascal_case.required_suffix = | ||
dotnet_naming_style.pascal_case.word_separator = | ||
dotnet_naming_style.pascal_case.capitalization = pascal_case | ||
|
||
dotnet_naming_style.begins_with_i.required_prefix = I | ||
dotnet_naming_style.begins_with_i.required_suffix = | ||
dotnet_naming_style.begins_with_i.word_separator = | ||
dotnet_naming_style.begins_with_i.capitalization = pascal_case |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,92 @@ | ||
# Cursively | ||
A fast, RFC4180-compliant CSV reading library for .NET. Written in C#. | ||
A fast, [RFC 4180](https://tools.ietf.org/html/rfc4180)-conforming CSV reading library for .NET. Written in C#. | ||
|
||
Supports files encoded in either UTF-8 or single-byte Windows codepages. | ||
| License | CI (AppVeyor) | NuGet | MyGet (pre-release) | | ||
| ------- | ------------- | ----- | ------------------- | | ||
| [![License](https://img.shields.io/github/license/airbreather/Cursively.svg)](https://github.com/airbreather/Cursively/blob/develop/LICENSE.md) | [![CI](https://ci.appveyor.com/api/projects/status/aqr1kmj9qqfx6ple?svg=true)](https://ci.appveyor.com/project/airbreather/Cursively) | [![NuGet](https://img.shields.io/nuget/v/Cursively.svg)](https://www.nuget.org/packages/Cursively/) | [![MyGet](https://img.shields.io/myget/airbreather/vpre/Cursively.svg?style=flat)](https://myget.org/feed/airbreather/package/nuget/Cursively) | | ||
|
||
## Documentation | ||
Documentation is currently being published as [GitHub Pages](https://airbreather.github.io/Cursively/index.html). | ||
|
||
## Usage | ||
1. Create a subclass of `CsvReaderVisitorBase` with your own logic. | ||
1. To read a CSV file: | ||
- Create a new instance of your visitor. | ||
- Create a new instance of `CsvTokenizer`. | ||
- Call `CsvTokenizer.ProcessNextChunk` for each chunk of the file. | ||
- Call `CsvTokenizer.ProcessEndOfStream` after the last chunk of the file. | ||
|
||
## Example | ||
This demonstrates using Cursively to write the details of a particular UTF-8 encoded file to the console. | ||
|
||
```csharp | ||
public static void ProcessCsvFile(string csvFilePath) | ||
{ | ||
var myVisitor = new MyVisitor(maxFieldLength: 1000); | ||
var tokenizer = new CsvTokenizer(); | ||
using (var file = File.OpenRead(csvFilePath)) | ||
{ | ||
Console.WriteLine($"Started reading '{csvFilePath}'."); | ||
Span<byte> fileReadBuffer = new byte[4096]; | ||
while (true) | ||
{ | ||
int count = file.Read(fileReadBuffer); | ||
if (count == 0) | ||
{ | ||
break; | ||
} | ||
|
||
var chunk = fileReadBuffer.Slice(0, count); | ||
tokenizer.ProcessNextChunk(chunk, myVisitor); | ||
} | ||
|
||
tokenizer.ProcessEndOfStream(myVisitor); | ||
} | ||
|
||
Console.WriteLine($"Finished reading '{csvFilePath}'."); | ||
} | ||
|
||
public sealed class MyVisitor : CsvReaderVisitorBase | ||
{ | ||
private readonly Decoder _utf8Decoder = Encoding.UTF8.GetDecoder(); | ||
|
||
private readonly char[] _buffer; | ||
|
||
private int _bufferConsumed; | ||
|
||
public MyVisitor(int maxFieldLength) => | ||
_buffer = new char[maxFieldLength]; | ||
|
||
public override void VisitPartialFieldContents(ReadOnlySpan<byte> chunk) => | ||
VisitFieldContents(chunk, flush: false); | ||
|
||
public override void VisitEndOfField(ReadOnlySpan<byte> chunk) => | ||
VisitFieldContents(chunk, flush: true); | ||
|
||
public override void VisitEndOfRecord() => | ||
Console.WriteLine("End of fields for this record."); | ||
|
||
private void VisitFieldContents(ReadOnlySpan<byte> chunk, bool flush) | ||
{ | ||
int charCount = _utf8Decoder.GetCharCount(chunk, flush); | ||
if (charCount + _bufferConsumed < _buffer.Length) | ||
{ | ||
_utf8Decoder.GetChars(chunk, new Span<char>(_buffer, _bufferConsumed, charCount), flush); | ||
_bufferConsumed += charCount; | ||
} | ||
else | ||
{ | ||
throw new InvalidDataException($"Field is longer than {_buffer.Length} characters."); | ||
} | ||
|
||
if (!flush) | ||
{ | ||
return; | ||
} | ||
|
||
Console.Write("Field: "); | ||
Console.WriteLine(_buffer, 0, _bufferConsumed); | ||
_bufferConsumed = 0; | ||
} | ||
} | ||
``` |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.