Skip to content

Commit 38d8e04

Browse files
committed
Feat: proper import from old repo
1 parent 2491d6d commit 38d8e04

File tree

7 files changed

+265
-21
lines changed

7 files changed

+265
-21
lines changed

.editorconfig

+32-21
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[*]
2-
charset = utf-8
2+
charset = utf-8-bom
33
end_of_line = crlf
44
trim_trailing_whitespace = false
55
insert_final_newline = false
@@ -9,16 +9,10 @@ indent_size = 4
99
# Microsoft .NET properties
1010
csharp_new_line_before_members_in_object_initializers = false
1111
csharp_new_line_before_open_brace = none
12-
csharp_preferred_modifier_order = private, public, protected, internal, file, new, required, readonly, abstract, static, async, unsafe, extern, override, volatile, sealed, virtual:suggestion
12+
csharp_preferred_modifier_order = public, internal, protected, private, static, async, virtual, file, new, sealed, override, required, abstract, extern, volatile, unsafe, readonly:suggestion
1313
csharp_style_prefer_utf8_string_literals = true:suggestion
1414
csharp_style_var_elsewhere = false:none
1515
csharp_style_var_for_built_in_types = false:suggestion
16-
dotnet_naming_rule.interfaces_rule.import_to_resharper = True
17-
dotnet_naming_rule.interfaces_rule.resharper_description = Interfaces
18-
dotnet_naming_rule.interfaces_rule.resharper_guid = a7a3339e-4e89-4319-9735-a9dc4cb74cc7
19-
dotnet_naming_rule.interfaces_rule.severity = warning
20-
dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style
21-
dotnet_naming_rule.interfaces_rule.symbols = interfaces_symbols
2216
dotnet_naming_rule.private_constants_rule.import_to_resharper = True
2317
dotnet_naming_rule.private_constants_rule.resharper_description = Constant fields (private)
2418
dotnet_naming_rule.private_constants_rule.resharper_guid = 236f7aa5-7b06-43ca-bf2a-9b31bfcff09a
@@ -31,6 +25,12 @@ dotnet_naming_rule.private_instance_fields_rule.resharper_guid = 4a98fdf6-7d98-4
3125
dotnet_naming_rule.private_instance_fields_rule.severity = warning
3226
dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style
3327
dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols
28+
dotnet_naming_rule.private_instance_fields_rule_1.import_to_resharper = True
29+
dotnet_naming_rule.private_instance_fields_rule_1.resharper_description = Instance fields (private)
30+
dotnet_naming_rule.private_instance_fields_rule_1.resharper_guid = 4a98fdf6-7d98-4f5a-afeb-ea44ad98c70c
31+
dotnet_naming_rule.private_instance_fields_rule_1.severity = warning
32+
dotnet_naming_rule.private_instance_fields_rule_1.style = lower_camel_case_style
33+
dotnet_naming_rule.private_instance_fields_rule_1.symbols = private_instance_fields_symbols_1
3434
dotnet_naming_rule.private_static_fields_rule.import_to_resharper = True
3535
dotnet_naming_rule.private_static_fields_rule.resharper_description = Static fields (private)
3636
dotnet_naming_rule.private_static_fields_rule.resharper_exclusive_prefixes_suffixes = true
@@ -50,16 +50,16 @@ dotnet_naming_rule.unity_serialized_field_rule.resharper_guid = 5f0fdb63-c892-4d
5050
dotnet_naming_rule.unity_serialized_field_rule.severity = warning
5151
dotnet_naming_rule.unity_serialized_field_rule.style = lower_camel_case_style_1
5252
dotnet_naming_rule.unity_serialized_field_rule.symbols = unity_serialized_field_symbols
53-
dotnet_naming_style.i_upper_camel_case_style.capitalization = pascal_case
54-
dotnet_naming_style.i_upper_camel_case_style.required_prefix = I
53+
dotnet_naming_rule.unity_serialized_field_rule_1.import_to_resharper = True
54+
dotnet_naming_rule.unity_serialized_field_rule_1.resharper_description = Unity serialized field
55+
dotnet_naming_rule.unity_serialized_field_rule_1.resharper_guid = 5f0fdb63-c892-4d2c-9324-15c80b22a7ef
56+
dotnet_naming_rule.unity_serialized_field_rule_1.severity = warning
57+
dotnet_naming_rule.unity_serialized_field_rule_1.style = lower_camel_case_style_1
58+
dotnet_naming_rule.unity_serialized_field_rule_1.symbols = unity_serialized_field_symbols_1
5559
dotnet_naming_style.lower_camel_case_style.capitalization = camel_case
5660
dotnet_naming_style.lower_camel_case_style.required_prefix = _
5761
dotnet_naming_style.lower_camel_case_style_1.capitalization = camel_case
5862
dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case
59-
dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities = *
60-
dotnet_naming_symbols.interfaces_symbols.applicable_kinds = interface
61-
dotnet_naming_symbols.interfaces_symbols.resharper_applicable_kinds = interface
62-
dotnet_naming_symbols.interfaces_symbols.resharper_required_modifiers = any
6363
dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private
6464
dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field
6565
dotnet_naming_symbols.private_constants_symbols.required_modifiers = const
@@ -69,6 +69,10 @@ dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities
6969
dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field
7070
dotnet_naming_symbols.private_instance_fields_symbols.resharper_applicable_kinds = field, readonly_field
7171
dotnet_naming_symbols.private_instance_fields_symbols.resharper_required_modifiers = instance
72+
dotnet_naming_symbols.private_instance_fields_symbols_1.applicable_accessibilities = private
73+
dotnet_naming_symbols.private_instance_fields_symbols_1.applicable_kinds = field
74+
dotnet_naming_symbols.private_instance_fields_symbols_1.resharper_applicable_kinds = field,readonly_field
75+
dotnet_naming_symbols.private_instance_fields_symbols_1.resharper_required_modifiers = instance
7276
dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private
7377
dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field
7478
dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static
@@ -83,6 +87,10 @@ dotnet_naming_symbols.unity_serialized_field_symbols.applicable_accessibilities
8387
dotnet_naming_symbols.unity_serialized_field_symbols.applicable_kinds =
8488
dotnet_naming_symbols.unity_serialized_field_symbols.resharper_applicable_kinds = unity_serialised_field
8589
dotnet_naming_symbols.unity_serialized_field_symbols.resharper_required_modifiers = instance
90+
dotnet_naming_symbols.unity_serialized_field_symbols_1.applicable_accessibilities = *
91+
dotnet_naming_symbols.unity_serialized_field_symbols_1.applicable_kinds =
92+
dotnet_naming_symbols.unity_serialized_field_symbols_1.resharper_applicable_kinds = unity_serialised_field
93+
dotnet_naming_symbols.unity_serialized_field_symbols_1.resharper_required_modifiers = instance
8694
dotnet_sort_system_directives_first = false
8795
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
8896
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:none
@@ -96,30 +104,30 @@ dotnet_style_qualification_for_property = false:suggestion
96104
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
97105

98106
# ReSharper properties
99-
resharper_align_linq_query = true
100107
resharper_align_multiline_binary_expressions_chain = false
101108
resharper_align_multiline_statement_conditions = false
102109
resharper_arguments_anonymous_function = named
103110
resharper_arguments_skip_single = true
104111
resharper_autodetect_indent_settings = true
105-
resharper_blank_lines_after_block_statements = 0
106112
resharper_blank_lines_after_control_transfer_statements = 1
107113
resharper_blank_lines_after_file_scoped_namespace_directive = 0
108-
resharper_blank_lines_after_multiline_statements = 1
109114
resharper_blank_lines_after_start_comment = 0
110115
resharper_blank_lines_around_auto_property = 0
111116
resharper_blank_lines_around_block_case_section = 1
112117
resharper_blank_lines_around_property = 0
113118
resharper_braces_for_for = required
114119
resharper_braces_for_foreach = required_for_multiline_statement
120+
resharper_braces_for_ifelse = not_required
115121
resharper_braces_for_while = required_for_multiline
116122
resharper_braces_redundant = false
123+
resharper_cpp_insert_final_newline = true
124+
resharper_csharp_blank_lines_around_field = 0
117125
resharper_csharp_blank_lines_around_invocable = 0
118-
resharper_csharp_blank_lines_around_namespace = 0
119126
resharper_csharp_blank_lines_around_region = 0
120127
resharper_csharp_blank_lines_inside_region = 0
121128
resharper_csharp_insert_final_newline = true
122-
resharper_csharp_max_line_length = 520
129+
resharper_csharp_keep_blank_lines_in_declarations = 100
130+
resharper_csharp_max_line_length = 505
123131
resharper_csharp_remove_blank_lines_near_braces_in_code = false
124132
resharper_csharp_remove_blank_lines_near_braces_in_declarations = false
125133
resharper_csharp_space_around_alias_eq = false
@@ -133,7 +141,7 @@ resharper_formatter_off_tag = @formatter:off
133141
resharper_formatter_on_tag = @formatter:on
134142
resharper_formatter_tags_enabled = true
135143
resharper_indent_preprocessor_if = usual_indent
136-
resharper_indent_preprocessor_other = usual_indent
144+
resharper_indent_preprocessor_other = do_not_change
137145
resharper_indent_raw_literal_string = indent
138146
resharper_instance_members_qualify_declared_in =
139147
resharper_keep_existing_attribute_arrangement = true
@@ -151,10 +159,12 @@ resharper_place_simple_case_statement_on_same_line = true
151159
resharper_place_simple_embedded_statement_on_same_line = true
152160
resharper_place_simple_initializer_on_single_line = false
153161
resharper_place_simple_list_pattern_on_single_line = false
162+
resharper_place_type_attribute_on_same_line = if_owner_is_single_line
154163
resharper_qualified_using_at_nested_scope = true
155164
resharper_space_within_empty_braces = false
165+
resharper_treat_case_statement_with_break_as_simple = false
156166
resharper_use_indent_from_vs = false
157-
resharper_wrap_list_pattern = chop_if_long
167+
resharper_wrap_list_pattern = chop_always
158168
resharper_wrap_object_and_collection_initializer_style = chop_always
159169

160170
# ReSharper inspection severities
@@ -164,6 +174,7 @@ resharper_arrange_type_member_modifiers_highlighting = hint
164174
resharper_arrange_type_modifiers_highlighting = hint
165175
resharper_built_in_type_reference_style_for_member_access_highlighting = hint
166176
resharper_built_in_type_reference_style_highlighting = hint
177+
resharper_html_path_error_highlighting = none
167178
resharper_mvc_action_not_resolved_highlighting = warning
168179
resharper_mvc_area_not_resolved_highlighting = warning
169180
resharper_mvc_controller_not_resolved_highlighting = warning

assets/icon.png

17.3 KB
Loading

src/CodeOfChaos.Parsers.Csv/CodeOfChaos.Parsers.Csv.csproj

+21
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,31 @@
55
<LangVersion>latest</LangVersion>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
8+
9+
<!-- Main package name -->
10+
<PackageId>CodeOfChaos.Parsers.Csv</PackageId>
11+
<Version>2.0.0-preview.0</Version>
12+
<Authors>Anna Sas</Authors>
13+
<Description>A Library to parse csv files in a similar api to regular xml parsing</Description>
14+
<PackageProjectUrl>https://github.com/code-of-chaos/cs-code_of_chaos-parsers</PackageProjectUrl>
15+
<PackageTags>csv parsing</PackageTags>
16+
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
17+
<PublishRepositoryUrl>true</PublishRepositoryUrl>
18+
<IncludeSymbols>true</IncludeSymbols>
19+
<DebugType>embedded</DebugType>
20+
<PackageLicenseFile>LICENSE</PackageLicenseFile>
21+
<PackageReadmeFile>README.md</PackageReadmeFile>
22+
<PackageIcon>icon.png</PackageIcon>
823
</PropertyGroup>
924

1025
<ItemGroup>
1126
<PackageReference Include="CodeOfChaos.Extensions" Version="0.20.0-preview.1" />
1227
</ItemGroup>
1328

29+
<ItemGroup>
30+
<None Include="..\..\LICENSE" Pack="true" PackagePath="" />
31+
<None Include="README.md" Pack="true" PackagePath="" />
32+
<None Include="../../assets/icon.png" Pack="true" PackagePath="" />
33+
</ItemGroup>
34+
1435
</Project>

src/CodeOfChaos.Parsers.Csv/README.md

+164
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
# CodeOfChaos.Parsers.Csv
2+
3+
`CodeOfChaos.Parsers.Csv` is a lightweight library for parsing CSV files in .NET with an API inspired by conventional XML parsing. It supports handling CSV data in multiple formats such as objects, dictionaries, and enumerable collections, with both synchronous and asynchronous processing capabilities.
4+
5+
---
6+
7+
## Features
8+
9+
### CSV Parsing
10+
Transform CSV content into multiple output formats:
11+
- **Object Mapping** – Convert CSV rows directly into objects.
12+
- **Dynamic Parsing** – Parse CSV data into dictionaries for flexible usage.
13+
- **Enumerable Support** – Process rows in batches or streams to handle large files efficiently.
14+
- **Header Mapping** – Automatically map CSV headers to object properties using configurable behavior.
15+
16+
---
17+
18+
### Writing CSV
19+
Create CSV files or strings from .NET objects:
20+
- Write objects directly to CSV, with easy-to-use serialization.
21+
- Support for both synchronous and asynchronous writing.
22+
23+
---
24+
25+
### Configuration Options
26+
Customize CSV parsing and writing:
27+
- **Delimiters** – Support different separators like `,`, `;`, or custom characters.
28+
- **Header Handling** – Include or exclude headers.
29+
- **Error Logging** – Log and handle errors gracefully.
30+
- **Batch Processing** – Manage large files by processing data in chunks.
31+
32+
---
33+
34+
### Attribute-Based Column Mapping
35+
Map CSV columns explicitly to object properties using attributes:
36+
- `[CsvColumn("ColumnName")]` maps specific CSV headers to class properties.
37+
- Useful for handling CSVs with non-standard or verbose field names.
38+
39+
---
40+
41+
## Installation
42+
43+
This library targets `.NET 9.0` and requires C# 13.0. Ensure your project meets these requirements before using.
44+
45+
Add the dependency to your project via NuGet:
46+
```bash
47+
dotnet add package CodeOfChaos.Parsers.Csv --version 2.0.0-preview.0
48+
```
49+
50+
---
51+
52+
## Usage
53+
54+
Here’s how you can leverage the `CodeOfChaos.Parsers.Csv` library:
55+
56+
### Configuring the Parser
57+
You can create and configure a `CsvParser` instance using the `CsvParser.FromConfig` method. For example:
58+
59+
```csharp
60+
var parser = CsvParser.FromConfig(cfg => {
61+
cfg.ColumnSplit = ";"; // Use `;` as the delimiter
62+
cfg.IncludeHeader = true; // Parse CSV with a header row
63+
cfg.BatchSize = 100; // Process data in smaller batches
64+
});
65+
```
66+
67+
---
68+
69+
### Parsing CSV to Objects
70+
```csharp
71+
using CodeOfChaos.Parsers.Csv;
72+
73+
class Person {
74+
public string Name { get; set; } = default!;
75+
public int Age { get; set; }
76+
}
77+
78+
var parser = CsvParser.FromConfig(cfg => cfg.ColumnSplit = ",");
79+
var people = parser.ToList<Person>("path/to/file.csv");
80+
81+
foreach (var person in people) {
82+
Console.WriteLine($"{person.Name} is {person.Age} years old.");
83+
}
84+
```
85+
86+
---
87+
88+
### Parsing CSV to Dictionary
89+
If you need more dynamic handling and don't want to use object mapping, you can parse CSV data into a dictionary:
90+
91+
```csharp
92+
using CodeOfChaos.Parsers.Csv;
93+
94+
var parser = CsvParser.FromConfig(cfg => cfg.ColumnSplit = ",");
95+
IEnumerable<Dictionary<string, string?>> rows = parser.ToDictionaryEnumerable("path/to/file.csv");
96+
97+
foreach (var row in rows) {
98+
Console.WriteLine($"Name: {row["Name"]}, Age: {row["Age"]}");
99+
}
100+
```
101+
102+
---
103+
104+
### Handling Large Files with Enumeration
105+
For large files, you can use `ToEnumerable` for lazy loading and processing of rows:
106+
107+
```csharp
108+
var parser = CsvParser.FromConfig(cfg => cfg.ColumnSplit = ",");
109+
await foreach (var person in parser.ToEnumerableAsync<Person>("path/to/large-file.csv")) {
110+
Console.WriteLine($"{person.Name} is {person.Age} years old.");
111+
}
112+
```
113+
114+
---
115+
116+
### Writing Objects to CSV
117+
Write a collection of objects back to a CSV file:
118+
119+
```csharp
120+
using CodeOfChaos.Parsers.Csv;
121+
122+
var people = new[] {
123+
new Person { Name = "John", Age = 30 },
124+
new Person { Name = "Jane", Age = 25 }
125+
};
126+
127+
var parser = CsvParser.FromConfig(cfg => cfg.ColumnSplit = ",");
128+
parser.ParseToFile("output.csv", people);
129+
```
130+
131+
---
132+
133+
### Using Attributes for Column Mapping
134+
Use the `[CsvColumn]` attribute to map CSV columns to object properties:
135+
136+
```csharp
137+
using CodeOfChaos.Parsers.Csv;
138+
139+
class User {
140+
[CsvColumn("username")]
141+
public string Name { get; set; } = default!;
142+
143+
[CsvColumn("age")]
144+
public int Age { get; set; }
145+
}
146+
147+
var parser = CsvParser.FromConfig(cfg => cfg.ColumnSplit = ",");
148+
var users = parser.ToList<User>("path/to/file.csv");
149+
150+
// Input CSV example:
151+
// username,age
152+
// John,30
153+
// Jane,25
154+
155+
foreach (var user in users) {
156+
Console.WriteLine($"{user.Name} is {user.Age} years old.");
157+
}
158+
```
159+
160+
---
161+
162+
## Contributing
163+
164+
Feel free to fork and contribute to the project by submitting pull requests. When contributing, ensure your changes align with the project’s coding standards.
+20
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,33 @@
11
// ---------------------------------------------------------------------------------------------------------------------
22
// Imports
33
// ---------------------------------------------------------------------------------------------------------------------
4+
using CodeOfChaos.CliArgsParser;
5+
using CodeOfChaos.CliArgsParser.Library;
6+
47
namespace Tools.CodeOfChaos.Parsers;
58

69
// ---------------------------------------------------------------------------------------------------------------------
710
// Code
811
// ---------------------------------------------------------------------------------------------------------------------
912
public static class Program {
1013
public static async Task Main(string[] args) {
14+
// Register & Build the parser
15+
// Don't forget to add the current assembly if you built more tools for the current project
16+
CliArgsParser parser = CliArgsBuilder.CreateFromConfig(
17+
config => {
18+
config.AddCommandsFromAssemblyEntrypoint<IAssemblyEntry>();
19+
}
20+
).Build();
21+
22+
// We are doing this here because else the launchSettings.json file becomes a humongous issue to deal with.
23+
// Sometimes CLI params is not the answer.
24+
// Code is the true saviour
25+
string projects = string.Join(";",
26+
"CodeOfChaos.Parsers.Csv"
27+
);
28+
string oneLineArgs = InputHelper.ToOneLine(args).Replace("%PROJECTS%", projects);
1129

30+
// Finally start executing
31+
await parser.ParseAsync(oneLineArgs);
1232
}
1333
}

0 commit comments

Comments
 (0)