Inhaltsverzeichnis
- CSV-Dateistandard
- Dateibeispiel
- RFC 4180
- Vereinfachungsstandards
- CSV-Dateien lesen und schreiben
- Verwenden von CsvHelper
- Benutzerdefinierte Methode verwenden
- Zusammenfassen
In Projekten stoßen wir häufig auf die Notwendigkeit, CSV-Dateien zu lesen und zu schreiben. Die Hauptschwierigkeit ist das Parsen von CSV-Dateien. In diesem Artikel werden drei Methoden zum Parsen von CSV-Dateien vorgestellt : CsvHelper , TextFieldParser und reguläre Ausdrücke . Übrigens wird auch vorgestellt, wie man CSV-Dateien schreibt.
CSV-Dateistandard
Bevor wir die Lese- und Schreibmethoden von CSV-Dateien vorstellen, müssen wir das Format von CSV-Dateien verstehen.
Dateibeispiel
Eine einfache CSV-Datei:
1 2 3 |
|
Eine nicht ganz so einfache CSV-Datei:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Sie haben richtig gelesen, die beiden oben genannten sind beide CSV-Dateien und beide enthalten nur drei Zeilen mit CSV-Daten. Das zweite Betrachten der zweiten Datei ist eine mentale Verschmutzung, aber es ist unvermeidlich, dass solche Dateien im Projekt auftauchen.
RFC 4180
Es gibt keinen offiziellen Standard für CSV-Dateien, aber allgemeine Projekte entsprechen dem RFC 4180-Standard. Dies ist ein inoffizieller Standard und der Inhalt ist wie folgt:
Jeder Datensatz befindet sich in einer separaten Zeile, die durch einen Zeilenumbruch (CRLF) getrennt ist.
Der letzte Datensatz in der Datei kann einen Zeilenumbruch am Ende haben oder auch nicht.
Möglicherweise erscheint als erste Zeile der Datei eine optionale Kopfzeile mit demselben Format wie normale Datensatzzeilen. Dieser Header enthält Namen, die den Feldern in der Datei entsprechen, und sollte die gleiche Anzahl von Feldern enthalten wie die Datensätze im Rest der Datei (das Vorhandensein oder Fehlen der Headerzeile sollte über den optionalen Parameter „header“ angegeben werden). Mime Typ).
Innerhalb der Kopfzeile und jedes Datensatzes können ein oder mehrere durch Kommas getrennte Felder vorhanden sein. Jede Zeile in der gesamten Datei sollte die gleiche Anzahl an Feldern enthalten. Leerzeichen gelten als Teil eines Feldes und sollten nicht ignoriert werden. Auf das letzte Feld im Datensatz darf kein Komma folgen.
Jedes Feld kann in doppelte Anführungszeichen eingeschlossen sein oder auch nicht (einige Programme wie Microsoft Excel verwenden jedoch überhaupt keine doppelten Anführungszeichen). Wenn Felder nicht in doppelte Anführungszeichen eingeschlossen sind, werden in den Feldern möglicherweise keine doppelten Anführungszeichen angezeigt.
Felder, die Zeilenumbrüche (CRLF), doppelte Anführungszeichen und Kommas enthalten, sollten in doppelte Anführungszeichen gesetzt werden.
Wenn doppelte Anführungszeichen zum Einschließen von Feldern verwendet werden, muss ein doppeltes Anführungszeichen, das innerhalb eines Felds erscheint, durch ein vorangehendes weiteres doppeltes Anführungszeichen maskiert werden.
übersetzen:
- Jeder Datensatz befindet sich in einer separaten Zeile, getrennt durch ein Zeilenumbruchzeichen (CRLF).
- Der letzte Datensatz in der Datei kann ein abschließendes Zeilenumbruchzeichen haben oder auch nicht.
- Möglicherweise gibt es eine optionale Kopfzeile, die als erste Zeile der Datei im gleichen Format wie eine normale Datensatzzeile angezeigt wird. Dieser Header enthält Namen, die den Feldern in der Datei entsprechen, und sollte die gleiche Anzahl von Feldern enthalten wie die Datensätze im Rest der Datei (das Vorhandensein oder Fehlen einer Headerzeile sollte durch den optionalen Parameter „header“ angezeigt werden). dieses MIME-Typs).
- Im Header und in jedem Datensatz können ein oder mehrere durch Kommas getrennte Felder vorhanden sein. In der gesamten Datei sollte jede Zeile die gleiche Anzahl an Feldern enthalten. Leerzeichen gelten als Teil des Feldes und sollten nicht ignoriert werden. Nach dem letzten Feld im Datensatz darf kein Komma stehen.
- Jedes Feld kann in doppelte Anführungszeichen eingeschlossen werden oder nicht (einige Programme wie Microsoft Excel verwenden jedoch überhaupt keine doppelten Anführungszeichen). Wenn das Feld nicht in doppelte Anführungszeichen gesetzt ist, werden die doppelten Anführungszeichen möglicherweise nicht im Feld angezeigt.
- Felder, die Zeilenumbrüche (CRLF), doppelte Anführungszeichen und Kommas enthalten, sollten in doppelte Anführungszeichen gesetzt werden.
- Wenn Sie ein Feld in doppelte Anführungszeichen einschließen, muss dem im Feld angezeigten doppelten Anführungszeichen ein weiteres doppeltes Anführungszeichen vorangestellt werden.
Vereinfachungsstandards
Der obige Standard ist möglicherweise etwas schwierig auszusprechen, daher werden wir ihn etwas vereinfachen. Es ist zu beachten, dass Vereinfachung nicht einfach darin besteht, Regeln zu streichen, sondern ähnliche Regeln zum besseren Verständnis zusammenzuführen.
Der folgende Code verwendet auch die folgenden Vereinfachungskriterien:
- Jeder Datensatz befindet sich in einer separaten Zeile, getrennt durch ein Zeilenumbruchzeichen (CRLF).
- Hinweis: Die Zeile hier ist keine Zeile im herkömmlichen Textsinn, sondern bezieht sich auf einen Datensatz, der dem CSV-Dateiformat entspricht (im Folgenden als CSV-Zeile bezeichnet ), der mehrere Zeilen im Text belegen kann.
- Der letzte Datensatz in der Datei muss ein abschließendes Zeilenumbruchzeichen haben und die erste Zeile der Datei muss eine Kopfzeile sein (die Kopfzeile enthält die Namen, die den Feldern entsprechen, und die Anzahl der Kopfzeilen entspricht der Anzahl der Felder im Protokoll).
- Hinweis: Die optionalen Optionen im ursprünglichen Standard sind einheitlich als obligatorisch angegeben, um eine spätere Analyse zu erleichtern, und es gibt keine Kopfzeile, um anderen die Daten anzuzeigen.
- Im Header und in jedem Datensatz können ein oder mehrere durch Kommas getrennte Felder vorhanden sein. In der gesamten Datei sollte jede Zeile die gleiche Anzahl an Feldern enthalten . Leerzeichen gelten als Teil des Feldes und sollten nicht ignoriert werden . Nach dem letzten Feld im Datensatz darf kein Komma stehen .
- Hinweis: Dieser Standard wurde nicht vereinfacht. Obwohl es andere Standards gibt, die Leerzeichen, Tabulatoren usw. zur Trennung verwenden, werden Dateien, die nicht durch Kommas getrennt sind, immer noch als durch Kommas getrennte Wertedateien bezeichnet?
- Jedes Feld ist in doppelte Anführungszeichen eingeschlossen, und einem doppelten Anführungszeichen, das in einem Feld erscheint, muss ein weiteres doppeltes Anführungszeichen vorangestellt sein
- Hinweis: Im ursprünglichen Standard gibt es Situationen, in denen doppelte Anführungszeichen verwendet werden müssen und optionale doppelte Anführungszeichen verwendet werden. Daher wird es definitiv nicht schief gehen, wenn alle doppelten Anführungszeichen verwendet werden. *
CSV-Dateien lesen und schreiben
Bevor wir CSV-Dateien offiziell lesen und schreiben können, müssen wir eine Testklasse zum Testen definieren. Code wie folgt anzeigen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
Generieren Sie einige Testdaten. Der Code lautet wie folgt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
Verwenden von CsvHelper
CsvHelper ist eine Bibliothek zum Lesen und Schreiben von CSV-Dateien und unterstützt das Lesen und Schreiben benutzerdefinierter Klassenobjekte.
github上标星最高的CSV文件读写C#库,使用MS-PL、Apache 2.0开源协议。
使用NuGet下载CsvHelper,读写CSV文件的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
如果你只想要拿来就能用的库,那文章基本上到这里就结束了。
使用自定义方法
为了与CsvHelper区分,新建一个CsvFile类存放自定义读写CSV文件的代码,最后会提供类的完整源码。CsvFile类定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
基于简化标准的写CSV文件
根据简化标准(具体标准内容见前文),写CSV文件代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
|
使用时,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
你也可以使用默认的字段转换方法,代码如下:
1 |
|
使用TextFieldParser解析CSV文件
TextFieldParser是VB中解析CSV文件的类,C#虽然没有类似功能的类,不过可以调用VB的TextFieldParser来实现功能。
TextFieldParser解析CSV文件的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
使用时,代码如下:
1 2 |
|
使用正则表达式解析CSV文件
如果你有一个问题,想用正则表达式来解决,那么你就有两个问题了。
正则表达式有一定的学习门槛,而且学习后不经常使用就会忘记。正则表达式解决的大多数是一些不易变更需求的问题,这就导致一个稳定可用的正则表达式可以传好几代。
本节的正则表达式来自 《精通正则表达式(第3版)》 第6章 打造高效正则表达式——简单的消除循环的例子,有兴趣的可以去了解一下,表达式说明如下:
Hinweis: Die endgültige Version des regulären Ausdrucks zum Parsen von CSV-Dateien in diesem Buch ist die Java-Version, die Possessivquantoren anstelle von fester Gruppierung verwendet. Es handelt sich auch um eine Version, die häufig auf Baidu zu finden ist. Es gibt jedoch ein Problem mit dem Possessivprioritätsquantifizierer in C#. Da ich aufgrund meiner eingeschränkten Fähigkeiten nicht in der Lage bin, es zu lösen, habe ich die oben gezeigte Version verwendet. Es gibt jedoch keinen Leistungsunterschied zwischen den beiden Versionen regulärer Ausdrücke.
Der Code der CSV-Datei zum Parsen regulärer Ausdrücke lautet wie folgt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
|
Der verwendete Code lautet wie folgt:
1 2 |
|
Bisher wurden keine Fehler beim Parsen regulärer Ausdrücke gefunden, die Verwendung wird jedoch weiterhin nicht empfohlen.
Vollständige CsvFile-Toolklasse
Der vollständige CsvFile-Klassencode lautet wie folgt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
|
So verwenden Sie es:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|