Imagine un archivo de texto donde cada registro csv puede tener diferentes números de campos. La tarea es escribir código para generar cuántos campos hay en cada registro del archivo. Puede suponer que no hay una línea de encabezado en el archivo y puede leer desde un archivo o entrada estándar, según lo elija.
Puede asumir una versión de rfc4180 para las reglas csv que explicaré a continuación para la definición de cada línea del archivo. Aquí hay una versión ligeramente editada de la parte relevante de la especificación:
Definición del formato CSV
Cada registro está ubicado en una línea separada, delimitada por un salto de línea (CRLF). Por ejemplo:
aaa,bbb,ccc CRLF zzz,yyy,xxx CRLF
El último registro en el archivo puede o no tener un salto de línea final. Por ejemplo:
aaa,bbb,ccc CRLF zzz,yyy,xxx
(La regla 3. no se aplica en este desafío)
Dentro de cada registro, puede haber uno o más campos, separados por comas. Los espacios se consideran parte de un campo y no se deben ignorar.
Cada campo puede estar o no encerrado entre comillas dobles. Si los campos no están encerrados entre comillas dobles, entonces las comillas dobles pueden no aparecer dentro de los campos. Por ejemplo:
"aaa","bbb","ccc" CRLF zzz,yyy,xxx
Los campos que contienen saltos de línea (CRLF), comillas dobles y comas deben ir entre comillas dobles. Por ejemplo:
"aaa","b CRLF bb","ccc" CRLF zzz,yyy,xxx
Si se usan comillas dobles para encerrar campos, entonces se debe escapar una comilla doble que aparece dentro de un campo precediéndola con otra comilla doble. Por ejemplo:
"aaa","b""bb","ccc"
Ejemplo
Entrada:
,"Hello, World!"
"aaa","b""bb","ccc"
zzz,yyy,
"aaa","b
bb","ccc","fish",""
Debería dar la salida:
2, 3, 3, 5
Puede proporcionar los valores de salida de la forma que le resulte más conveniente.
Bibliotecas
Puedes usar cualquier biblioteca que quieras.
Respuestas impresionantes hasta ahora, pero nos falta una respuesta de línea de comando / bash que sería particularmente genial.
R , 40 bytes
Pruébalo en línea!
Según la documentación de
count.fields
, los campos con saltos de línea obtienen un recuento de campos de NA para la línea inicial, por lo que los filtramos.fuente
JavaScript (ES2018),
4259 bytesMostrar fragmento de código
fuente
s
bandera en la expresión regular. No es que importe tanto ;-) ¡Y buen uso, por cierto!Jalea , 12 bytes
La respuesta Stax de un puerto recursivo : ¡ve a dar crédito!
Pruébalo en línea!
¿Cómo?
Tal vez prefiera
ṣ”"m2ẎỴċ€”,‘
:Ẏ
es apretar yċ€
cuenta las comas en cada uno.fuente
Python, 63 bytes
Devuelve la salida en un
map
objeto iterable .fuente
lambda
función puede reducir esto a 54 bytesWolfram Language (Mathematica) , 30 bytes
Pruébalo en línea!
fuente
Perl 5 .10.0,
5553 bytesPruébalo en línea!
Explicación:
fuente
Java 10, 101 bytes
Pruébalo en línea.
Explicación:
fuente
Jalea , 17 bytes
Pruébalo en línea!
-1 gracias a Jonathan Allan . duh duh duh ...
fuente