Importador CSV / DSV simple


12

Un poco más que un inverso de esto .

En: datos DSV  multilínea y un solo carácter delimitador. El DSV puede tomarse como un archivo, un nombre de archivo, una cadena separada por salto de línea, una lista de cadenas, etc. Todos los registros tienen el mismo número de campos y ningún campo está vacío. Los datos no contienen el carácter delimitador y no existe un mecanismo de comillas o escape.

Fuera:  una estructura de datos que representa el DSV, por ejemplo, una lista de listas de cadenas o una matriz de cadenas.

Ejemplos

["here is,some,sample","data,delimited,by commas"]y ",":
[["here is","some","sample"],["data","delimited","by commas"]]

["hello;\"","\";world","\";\""]y ";":
[["hello","\""],["\"","world"],["\"","\""]](se escapa porque este ejemplo usa JSON)

["to be or not","that is the question"]y " ":
[["to","be","or","not"],["that","is","the","question"]]


Entonces, para aclarar, ¿simplemente dividimos cada elemento en instancias del char dado?
ETHproductions

@ETHproductions Eso es correcto.
Adám

¿Cómo deberíamos dividir las cadenas si el primer o el último carácter es el delimitador? ",for,example,this,string,"
GB

@GB ningún campo está vacío
Adám

Entonces, ¿podemos suponer que no sucederá?
GB

Respuestas:


3

Gelatina , 3 2 bytes

Dennis señala que si bien la solución de 2 bytes parece no funcionar, el enlace diádico sí lo hace, y que en realidad es la forma en que se analizan los argumentos de la línea de comandos lo que hace que se vea de esa manera.

ṣ€

¡Pruébelo en línea! - pie de página llama a la función con izquierda y derecha establecidas explícitamente, y los formatos como una cuadrícula *.

Exactamente como el siguiente, excepto que se divide en las apariciones del argumento correcto en lugar de en sublistas iguales al argumento correcto.


œṣ€

El pie de página de 3 bytes muestra el resultado como una cuadrícula *.

Un enlace (función) diádico que toma la lista DSV a la izquierda y el delimitador a la derecha.

¿Cómo?

œṣ€ - Main link: list l, delimiter d
  € - for each item in l:
œṣ  -     split at occurrences of sublists equal to d

* Como un programa completo, la salida implícita simplemente "eliminaría" todos los caracteres, por lo que el pie de página del enlace TIO llama al enlace como una diada y lo usa Gpara formatear el resultado de manera agradable.


@Okx la salida implícita simplemente "aplastaría" a todos los personajes
Adám

@Okx Sí, es una función que devuelve una lista. El pie de página debe anular la salida implícita que se produce cuando se ejecuta como un programa completo.
Jonathan Allan

7

Japt , 3 bytes

mqV

¡Pruébalo en línea! (Utiliza la -Qbandera para imprimir la salida)

mqV  // Implicit: U, V = inputs
m    // Map each item in U by the following function:
 qV  //   Split the item at instances of V.
     // Implicit: output result of last expression

: ¡Oh, un JSGL venció a MATL!
Downgoat

7

Powershell, 25 22/23 bytes

Dos opciones, una solo llama dividir en el primer argumento, utilizando el segundo argumento como un valor de delimitación.

$args[0]-split$args[1]

Un byte más largo, incorporado para analizar csvs, toma el nombre de archivo como primer argumento y delimita como segundo.

ipcsv $args[0] $args[1]

-2 porque no requiere el parámetro -Delimiter( -D), y lo asumirá por defecto.

Lamentablemente, PowerShell no puede pasar una matriz de dos parámetros, ya que supondrá que ambos son archivos y ejecutará el comando contra él dos veces, por lo que puedo ver, ningún otro método de entrada de dos var es más corto que este, por lo que es probable La respuesta más corta posible.

ipcsves un alias para Import-Csv, toma un nombre de archivo como la primera entrada sin nombre y el carácter delimitado como el segundo comportamiento predeterminado.

Ejecutar contra el ejemplo de la página wiki devuelve

PS C:\Users\Connor\Desktop> .\csvparse.ps1 'example.csv' ','

Date     Pupil               Grade
----     -----               -----
25 May   Bloggs, Fred        C
25 May   Doe, Jane           B
15 July  Bloggs, Fred        A
15 April Muniz, Alvin "Hank" A


5

Haskell, 29 bytes

import Data.Lists
map.splitOn

Ejemplo de uso: (map.splitOn) " " ["to be or not","that is the question"]-> [["to","be","or","not"],["that","is","the","question"]].




4

Mathematica, 11 bytes

StringSplit

Función incorporada que toma dos argumentos, una lista de cadenas y un carácter (e incluso más general que eso). Ejemplo de uso:

StringSplit[{"to be or not", "that is the question"}, " "]

rendimientos

{{"to", "be", "or", "not"}, {"that", "is", "the", "question"}}

4

MATLAB / Octave, 41 25 bytes

@(x,d)regexp(x,d,'split')

Crea una función anónima llamada ansque acepta la primera entrada como una matriz de celdas de cadenas y la segunda entrada como una cadena.

ans({'Hello World', 'How are you'}, ' ')

Pruébalo en línea


4

Cheddar, 19 bytes

a->b->a=>@.split(b)

Buena demostración de habilidades de bucle. Agregué nueva composición y f.op. bloques de modo que permite un interesante golf. (=>:@.split)se supone que funciona pero no funciona :(


3

MATL, 14 12 4 bytes

H&XX

Pruébelo en MATL Online (el enlace tiene una modificación al final para mostrar la dimensionalidad de la matriz de celdas de salida).

Explicación

        % Implicitly grab the first input as a cell array of strings
        % Implicitly grab the delimiter as a string
H       % Push the number literal 2 to the stack
&XX     % Split the input at each appearance of the delimiter
        % Implicitly display the result

1

CJam, 5 bytes

l~l./

Explicación:

l~     e#Input evaluated (as list)
  l    e#Another line of input
   ./  e#Split first input by second

1

Ruby usando '-n', 17 + 1 = 18 bytes

p chomp.split *$*

Cómo funciona

  • Entrada del archivo
  • el separador se proporciona como parámetro de línea de comando
  • *$*Como solo tenemos 1 parámetro, salpica la cadena y podemos usarla como parámetro para la splitfunción
  • Traté de evitarlo, chomppero cualquier otra solución parece ser más larga que esta.


1

GNU sed , 48 + 1 (r flag) = 49 bytes

1h;1d
:
G
/,$/bp
s:(.)(.*)\n\1:,\2:
t
:p;s:..$::

Pruébalo en línea!

En sed no hay tipos de datos, pero una representación natural de una lista sería una colección de líneas. Como tal, el formato de entrada consiste en registros DSV cada uno en una línea separada, con el delimitador presente en la primera línea.

Explicación: por diseño, sed ejecuta el script tantas veces como haya líneas de entrada

1h;1d                  # store delimiter, start new cycle
:                      # begin loop
G                      # append saved delimiter
/,$/bp                 # if delimiter is ',', skip replacements and go to printing
s:(.)(.*)\n\1:,\2:     # replace first occurrence of delimiter with ','
t                      # repeat
:p;s:..$::             # print label: delete appended delimiter (implicit printing)

1

REXX, 95 bytes

arg f d
do l=1 while lines(f)
    n=linein(f)
    do #=1 while n>''
        parse var n w (d) n
        o.l.#=w
    end
end

Toma un nombre de archivo y un delimitador como argumentos, el contenido del archivo se coloca en la raíz o.


¿Es realmente necesario todo ese espacio en blanco?
Adám

No, solo he sangrado por legibilidad. El recuento de bytes es para código no indentado.
idrougge

¿Qué sabor de REXX es este?
Adám

Creo que es puro ANSI REXX. Solo lo probé con Regina.
idrougge


0

APL (Dyalog) , 4 bytes

En las versiones hasta 15.0 inclusive, esto necesita, lo ⎕ML←3cual es predeterminado por muchos. A partir de la versión 16.0 solo se puede reemplazar por el mismo efecto.

Toma el separador como argumento izquierdo y DSV como argumento derecho.

≠⊂¨⊢

Pruébalo en línea!

 las desigualdades (del argumento izquierdo y el argumento derecho)

⊂¨ dividir cada

 argumento correcto

Por partición se entiende eliminar todos los elementos indicados por un cero correspondiente en el argumento izquierdo, y comenzar una nueva partición siempre que el número correspondiente en el argumento izquierdo sea mayor que su predecesor, es decir, en cada uno si el argumento izquierdo es booleano, como Es el caso aquí.


0

R, 8 bytes (2 formas)

R tiene dos funciones integradas que cumplen los requisitos de este desafío:

strsplit

toma un vector de cadenas y un separador, y devuelve una lista de vectores de las cadenas separadas.

read.csv

toma un nombre de archivo y un separador, y devuelve un marco de datos. Técnicamente, esto podría ser de 10 bytes porque necesita la opción header=Fpara que no lea los primeros elementos como los nombres de columna. Actualmente el enlace TIO se lee desde stdin.

¡Prueba estos en línea!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.