Tabla de contenido
- Estándar de archivo CSV
- Ejemplo de archivo
- RFC 4180
- Estándares de simplificación
- Leer y escribir archivos CSV
- Usando CsvHelper
- Usar método personalizado
- Resumir
En los proyectos, a menudo nos encontramos con la necesidad de leer y escribir archivos CSV, la principal dificultad es el análisis de los archivos CSV. Este artículo presentará tres métodos para analizar archivos CSV: CsvHelper , TextFieldParser y expresiones regulares . Por cierto, también presentará cómo escribir archivos CSV.
Estándar de archivo CSV
Antes de presentar los métodos de lectura y escritura de archivos CSV, debemos comprender el formato de los archivos CSV.
Ejemplo de archivo
Un archivo CSV simple:
1 2 3 |
|
Un archivo CSV no tan simple:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Leíste bien, los dos anteriores son archivos CSV y ambos tienen solo 3 líneas de datos CSV. Mirar el segundo archivo dos veces es contaminación mental, pero es inevitable que dichos archivos aparezcan en el proyecto.
RFC 4180
No existe un estándar oficial para archivos CSV, pero los proyectos generales cumplirán con el estándar RFC 4180. Este es un estándar no oficial y el contenido es el siguiente:
Cada registro se ubica en una línea separada, delimitada por un salto de línea (CRLF).
El último registro del archivo puede tener o no un salto de línea final.
Es posible que aparezca una línea de encabezado opcional como la primera línea del archivo con el mismo formato que las líneas de registro normales. Este encabezado contendrá los nombres correspondientes a los campos del archivo y debe contener el mismo número de campos que los registros del resto del archivo (la presencia o ausencia de la línea del encabezado debe indicarse mediante el parámetro opcional "encabezado" de este Tipo de Mimica).
Dentro del encabezado y de cada registro, puede haber uno o más campos, separados por comas. Cada línea debe contener la misma cantidad de campos en todo el archivo. Los espacios se consideran parte de un campo y no deben ignorarse. El último campo del registro no debe ir seguido de una coma.
Cada campo puede o no estar entre comillas dobles (sin embargo, algunos programas, como Microsoft Excel, no utilizan comillas dobles en absoluto). Si los campos no están entre comillas dobles, es posible que las comillas dobles no aparezcan dentro de los campos.
Los campos que contienen saltos de línea (CRLF), comillas dobles y comas deben estar entre comillas dobles.
Si se utilizan comillas dobles para encerrar campos, entonces las comillas dobles que aparecen dentro de un campo se deben evitar precediéndolas con otra comilla doble.
traducir:
- Cada registro está en una línea separada, separada por un carácter de nueva línea (CRLF).
- El último registro del archivo puede tener o no un carácter de nueva línea final.
- Puede haber una línea de encabezado opcional que aparece como la primera línea del archivo, en el mismo formato que una línea de registro normal. Este encabezado contendrá nombres que corresponden a los campos del archivo y debe contener la misma cantidad de campos que los registros del resto del archivo (la presencia o ausencia de una fila de encabezado debe indicarse mediante el parámetro opcional "encabezado" de este tipo MIME).
- En el encabezado y en cada registro puede haber uno o más campos, separados por comas. En todo el archivo, cada línea debe contener la misma cantidad de campos. Los espacios en blanco se consideran parte del campo y no deben ignorarse. No puede haber una coma después del último campo del registro.
- Cada campo puede estar entre comillas dobles o no (pero algunos programas, como Microsoft Excel, no usan comillas dobles en absoluto). Si el campo no está entre comillas dobles, es posible que las comillas dobles no aparezcan dentro del campo.
- Los campos que contienen nuevas líneas (CRLF), comillas dobles y comas deben estar entre comillas dobles.
- Si utiliza comillas dobles para encerrar un campo, la comilla doble que aparece en el campo debe ir precedida por otra comilla doble.
Estándares de simplificación
El estándar anterior puede resultar un poco difícil de pronunciar, por lo que lo simplificaremos un poco. Cabe señalar que la simplificación no consiste simplemente en eliminar reglas, sino en fusionar otras similares para facilitar su comprensión.
El siguiente código también utilizará los criterios de simplificación, que son los siguientes:
- Cada registro está en una línea separada, separada por un carácter de nueva línea (CRLF).
- Nota: La línea aquí no es una línea en el sentido normal del texto, sino que se refiere a un registro que se ajusta al formato de archivo CSV (en adelante, línea CSV ) , que puede ocupar varias líneas en el texto.
- El último registro del archivo debe tener un carácter de nueva línea final y la primera línea del archivo debe ser una fila de encabezado (la fila de encabezado contiene los nombres correspondientes a los campos y el número de encabezados es el mismo que el número de campos). en el expediente).
- Nota: Las opciones opcionales en el estándar original se especifican uniformemente como obligatorias para facilitar el análisis posterior, y no hay una línea de encabezado que permita a otros ver los datos.
- En el encabezado y en cada registro puede haber uno o más campos , separados por comas. En todo el archivo, cada línea debe contener la misma cantidad de campos . Los espacios en blanco se consideran parte del campo y no deben ignorarse . No puede haber una coma después del último campo del registro .
- Nota: Este estándar no se ha simplificado. Aunque existen otros estándares que utilizan espacios, tabulaciones, etc. para la separación, ¿los archivos que no utilizan comas todavía se denominan archivos de valores separados por comas?
- Cada campo está entre comillas dobles y una comilla doble que aparece en un campo debe estar precedida por otra comilla doble.
- Nota: El estándar original tiene situaciones en las que se deben usar comillas dobles y se usan comillas dobles opcionales, por lo que definitivamente no saldrá mal si se usan todas las comillas dobles. *
Leer y escribir archivos CSV
Antes de leer y escribir oficialmente archivos CSV, debemos definir una clase de prueba para realizar pruebas. El código se muestra a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
Genere algunos datos de prueba, el código es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
Usando CsvHelper
CsvHelper es una biblioteca para leer y escribir archivos CSV, que admite la lectura y escritura de objetos de clase personalizados.
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章 打造高效正则表达式——简单的消除循环的例子,有兴趣的可以去了解一下,表达式说明如下:
Nota: La versión final de la expresión regular para analizar archivos CSV en este libro es la versión Java que utiliza cuantificadores posesivos en lugar de agrupación solidificada. También es una versión que se ve a menudo en Baidu. Sin embargo, hay un problema con el cuantificador de prioridad posesiva en C#. No puedo resolverlo debido a mi capacidad limitada, así que utilicé la versión que se muestra arriba. Sin embargo, no existe diferencia en el rendimiento entre las dos versiones de expresiones regulares.
La expresión regular que analiza el código del archivo CSV es la siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 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 sesenta y cinco 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 |
|
El código cuando se utiliza es el siguiente:
1 2 |
|
Hasta el momento no se han encontrado errores en el análisis de expresiones regulares, pero aún no se recomienda su uso.
Clase de herramienta CsvFile completa
El código completo de la clase CsvFile es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 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 sesenta y cinco 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 |
|
Cómo usarlo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 |
|