Importatore CSV / DSV semplice


12

Leggermente più di un contrario di questo .

In: dati DSV  multilinea e un singolo carattere delimitatore. Il DSV può essere considerato come un file, un nome file, una stringa separata da un'interruzione di riga, un elenco di stringhe, ecc. Tutti i record hanno lo stesso numero di campi e nessun campo è vuoto. I dati non contengono il carattere delimitatore e non esiste alcun meccanismo di quotatura o di escape.

Out:  una struttura di dati che rappresenta il DSV, ad esempio un elenco di elenchi di stringhe o una matrice di stringhe.

Esempi

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

["hello;\"","\";world","\";\""]e ";":
[["hello","\""],["\"","world"],["\"","\""]](scappa perché questo esempio usa JSON)

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


Quindi, solo per chiarire, abbiamo semplicemente diviso ogni elemento in istanze del carattere dato?
ETHproductions

@ETHproductions Esatto.
Adám,

Come dovremmo dividere le stringhe se il primo o l'ultimo carattere è il delimitatore? ",for,example,this,string,"
GB

@ GB nessun campo è vuoto
Adám

Quindi possiamo presumere che non accadrà?
GB

Risposte:


3

Gelatina , 3 2 byte

Dennis sottolinea che mentre la soluzione a 2 byte sembra non funzionare, lo stesso collegamento diadico funziona e che è in realtà il modo in cui vengono analizzati gli argomenti della riga di comando che la fanno apparire così.

ṣ€

Provalo online! - footer chiama la funzione con sinistra e destra impostate esplicitamente e formatta come una griglia *.

Esattamente come sotto, tranne per le suddivisioni in occorrenze dell'argomento giusto anziché in elenchi uguali all'argomento giusto.


œṣ€

Il 3 footer - footer visualizza il risultato come una griglia *.

Un collegamento diadico (funzione) che prende l'elenco DSV a sinistra e il delimitatore a destra.

Come?

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

* Come programma completo, l'output implicito dovrebbe semplicemente "smussare" tutti i caratteri, quindi il piè di pagina del collegamento TIO chiama il collegamento come una diade e utilizza Gper formattare il risultato in modo corretto.


@Okx l'output implicito semplicemente "distruggerebbe" tutti i personaggi
Adám,

@Okx Sì, è una funzione che restituisce un elenco. Il piè di pagina deve sovrascrivere l'output implicito che si verifica quando viene eseguito come programma completo.
Jonathan Allan,

7

Japt , 3 byte

mqV

Provalo online! (Usa la -Qbandiera per stampare piuttosto l'output)

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

: O un JSGL ha battuto MATL!
Downgoat

7

Powershell, 25 22/23 byte

Due opzioni, una chiama semplicemente split sul primo arg, usando il secondo arg come valore delim.

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

Un byte più lungo, incorporato per analizzare csvs, prende il nome del file come primo argomento e delim come secondo.

ipcsv $args[0] $args[1]

-2 perché non richiede il parametro -Delimiter( -D) e lo assumerà per impostazione predefinita.

purtroppo powershell non può passare un array di due parametri, poiché supporrà che siano entrambi file, e eseguirà il comando contro di esso due volte, nessun altro metodo di input a due var è più breve di questo per quanto posso vedere, quindi è probabile la risposta più breve possibile.

ipcsvè un alias per Import-Csv, accetta un nome file come primo input senza nome e il carattere delim come secondo per comportamento predefinito.

Corri contro l' esempio dai ritorni della pagina wiki

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 byte

import Data.Lists
map.splitOn

Esempio di utilizzo: (map.splitOn) " " ["to be or not","that is the question"]-> [["to","be","or","not"],["that","is","the","question"]].


4

05AB1E , 5 byte

vy²¡ˆ

Provalo online!

Spiegazione:

v     For each element in the input array
 y    Push the element
  ²   Push second input
   ¡  Split
    ˆ Add to array


4

Mathematica, 11 byte

StringSplit

Funzione integrata che accetta due argomenti, un elenco di stringhe e un carattere (e anche più generale di così). Esempio di utilizzo:

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

i rendimenti

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

4

MATLAB / Octave, 41 25 byte

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

Crea una funzione anonima denominata ansche accetta il primo input come array di celle di stringhe e il secondo input come stringa.

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

Provalo online


4

Cheddar, 19 byte

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

bella dimostrazione di abilità in loop. Ho aggiunto una nuova composizione e f.op. blocchi in modo da consentire golf interessanti. (=>:@.split)dovrebbe funzionare ma non lo fa :(


3

MATL, 14 12 4 byte

H&XX

Provalo su MATL Online (il link ha una modifica alla fine per mostrare la dimensionalità dell'array di celle di output).

Spiegazione

        % 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 byte

l~l./

Spiegazione:

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 byte

p chomp.split *$*

Come funziona

  • Input dal file
  • il separatore viene fornito come parametro della riga di comando
  • poiché abbiamo solo 1 parametro, *$*divide la stringa e possiamo usarla come parametro per la splitfunzione
  • Ho cercato di evitare, chompma qualsiasi altra soluzione sembra essere più lunga di questa.


1

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

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

Provalo online!

In sed non esistono tipi di dati, ma una rappresentazione naturale di un elenco sarebbe una raccolta di linee. Pertanto, il formato di input è costituito da record DSV ciascuno su una riga separata, con il delimitatore presente sulla prima riga.

Spiegazione: in base alla progettazione, sed esegue lo script tante volte quante sono le righe di input

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 byte

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

Prende un nome file e un delimitatore come argomenti, il contenuto del file viene messo in radice o.


Tutto quello spazio bianco è davvero necessario?
Adám,

No, l'ho solo indentato per leggibilità. Il conteggio dei byte è per il codice non indentato.
idrougge

Quale sapore di REXX è questo?
Adám,

Penso che sia ANSI REXX puro. L'ho provato solo con Regina.
idrougge,


0

APL (Dyalog) , 4 byte

Nelle versioni fino alla 15.0 inclusa, questo è necessario ⎕ML←3per molti. Dalla versione 16.0 può essere semplicemente sostituito da per lo stesso effetto.

Prende il separatore come argomento di sinistra e DSV come argomento di destra.

≠⊂¨⊢

Provalo online!

 le disuguaglianze (dell'argomento di sinistra e dell'argomento di destra)

⊂¨ partizionare ciascuno

 argomento giusto

Per partizione si intende rimuovere tutti gli elementi indicati da uno zero corrispondente nell'argomento sinistro e iniziare una nuova partizione ogni volta che un numero corrispondente nell'argomento sinistro è maggiore del suo predecessore, vale a dire su ognuno se l'argomento sinistro è booleano, come è il caso qui.


0

R, 8 byte (2 vie)

R ha due funzioni integrate che soddisfano i requisiti di questa sfida:

strsplit

prende un vettore di stringhe e un separatore e restituisce un elenco di vettori delle stringhe separate.

read.csv

accetta un nome file e un separatore e restituisce un frame di dati. Tecnicamente potrebbe trattarsi di 10 byte perché necessita dell'opzione in header=Fmodo che non legga i primi elementi come nomi di colonna. Attualmente il link TIO legge da stdin.

Prova questi online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.