Importateur CSV / DSV simple


12

Un peu plus qu'un inverse de cela .

Dans:  Multi-ligne DSV données et un seul caractère delimiter. Le DSV peut être considéré comme un fichier, un nom de fichier, une chaîne séparée par des sauts de ligne, une liste de chaînes, etc. Tous les enregistrements ont le même nombre de champs et aucun champ n'est vide. Les données ne contiennent pas le caractère délimiteur et il n'y a pas de mécanisme de citation ou d'échappement.

Out:  Une structure de données représentant le DSV, par exemple une liste de listes de chaînes ou une matrice de chaînes.

Exemples

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

["hello;\"","\";world","\";\""]et ";":
[["hello","\""],["\"","world"],["\"","\""]](s'échappe car cet exemple utilise JSON)

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


Donc, juste pour clarifier, nous divisons simplement chaque élément aux instances du caractère donné?
ETHproductions

@ETHproductions C'est vrai.
Adám

Comment diviser les chaînes si le premier ou le dernier caractère est le délimiteur? ",for,example,this,string,"
GB

@GB aucun champ n'est vide
Adám

Nous pouvons donc supposer que cela ne se produira pas?
GB

Réponses:


3

Gelée , 3 2 octets

Dennis souligne que bien que la solution à 2 octets ne semble pas fonctionner, le lien dyadique lui-même fonctionne, et que c'est en fait la façon dont les arguments de la ligne de commande sont analysés qui le fait ressembler à cela.

ṣ€

Essayez-le en ligne! - footer appelle la fonction avec les paramètres gauche et droit définis explicitement, et formate comme une grille *.

Exactement comme ci-dessous, à l'exception des divisions aux occurrences de l'argument de droite plutôt qu'aux sous-listes égales à l'argument de droite.


œṣ€

Le pied de page de 3 octets affiche le résultat sous forme de grille *.

Un lien dyadique (fonction) qui prend la liste DSV à gauche et le délimiteur à droite.

Comment?

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

* En tant que programme complet, la sortie implicite "associe" simplement tous les caractères, donc le pied de page du lien TIO appelle le lien en tant que dyade et utilise Gpour formater agréablement le résultat.


@Okx, la sortie implicite "écraserait" simplement tous les personnages
Adám

@Okx Oui, c'est une fonction qui renvoie une liste. Le pied de page consiste à remplacer la sortie implicite qui se produit lorsqu'elle est exécutée en tant que programme complet.
Jonathan Allan

7

Japt , 3 octets

mqV

Testez-le en ligne! (Utilise le -Qdrapeau pour imprimer la sortie)

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 a battu MATL!
Downgoat

7

Powershell, 25 22/23 octets

Deux options, l'une appelle simplement split sur le premier argument, en utilisant le deuxième argument comme valeur de délimitation.

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

Un octet de plus, intégré pour analyser csvs, prend le nom de fichier comme premier argument et le délimiteur comme second.

ipcsv $args[0] $args[1]

-2 car il ne nécessite pas le paramètre -Delimiter( -D), et l'assumera par défaut.

malheureusement, powershell ne peut pas passer un tableau de deux paramètres, car il supposera qu'il s'agit de deux fichiers et exécutera la commande deux fois, aucune autre méthode d'entrée à deux var n'est plus courte que ce que je peux voir, c'est donc probablement la réponse la plus courte possible.

ipcsvest un alias pour Import-Csv, prend un nom de fichier comme première entrée sans nom et le caractère délimiteur comme deuxième par défaut.

Exécuter contre l' exemple des retours de la page 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 octets

import Data.Lists
map.splitOn

Exemple d'utilisation: (map.splitOn) " " ["to be or not","that is the question"]-> [["to","be","or","not"],["that","is","the","question"]].




4

Mathematica, 11 octets

StringSplit

Fonction intégrée prenant deux arguments, une liste de chaînes et un caractère (et encore plus général que cela). Exemple d'utilisation:

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

les rendements

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

4

MATLAB / Octave, 41 25 octets

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

Crée une fonction anonyme nommée ansqui accepte la première entrée comme un tableau de cellules de chaînes et la deuxième entrée comme une chaîne.

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

Essayez-le en ligne


4

Cheddar, 19 octets

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

belle démonstration des capacités de bouclage. J'ai ajouté une nouvelle composition et f.op. blocs de sorte que permet un golf intéressant. (=>:@.split)est censé fonctionner mais il ne fonctionne pas :(


3

MATL, 14 12 4 octets

H&XX

Essayez-le sur MATL Online (le lien a une modification à la fin pour montrer la dimensionnalité du tableau de cellules en sortie).

Explication

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

l~l./

Explication:

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

1

Ruby utilisant '-n', 17 + 1 = 18 octets

p chomp.split *$*

Comment ça fonctionne

  • Entrée depuis un fichier
  • le séparateur est donné comme paramètre de ligne de commande
  • puisque nous n'avons qu'un seul paramètre, *$*répartit la chaîne et nous pouvons l'utiliser comme paramètre pour la splitfonction
  • J'ai essayé d'éviter chompmais toute autre solution semble être plus longue que cela.


1

GNU sed , 48 + 1 (drapeau r) = 49 octets

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

Essayez-le en ligne!

Dans sed, il n'y a pas de types de données, mais une représentation naturelle d'une liste serait une collection de lignes. En tant que tel, le format d'entrée se compose d'enregistrements DSV chacun sur une ligne distincte, avec le délimiteur présent sur la première ligne.

Explication: par conception, sed exécute le script autant de fois qu'il y a de lignes d'entrée

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 octets

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

Prend un nom de fichier et un délimiteur comme arguments, le contenu du fichier est mis en racine o.


Tout cet espace est-il vraiment nécessaire?
2017 à 8h03

Non, je l'ai seulement mis en retrait pour plus de lisibilité. Le nombre d'octets est pour le code non indenté.
idrougge

De quelle saveur REXX s'agit-il?
2017 à 9h39

Je pense que c'est pur ANSI REXX. Je ne l'ai testé qu'avec Regina.
idrougge


0

APL (Dyalog) , 4 octets

Dans les versions jusqu'à et y compris 15.0, cela a besoin ⎕ML←3qui est par défaut par beaucoup. À partir de la version 16.0, vous pouvez simplement le remplacer par le même effet.

Prend le séparateur comme argument de gauche et DSV comme argument de droite.

≠⊂¨⊢

Essayez-le en ligne!

 les inégalités (de l'argument de gauche et de l'argument de droite)

⊂¨ partitionner chacun

 bon argument

Par partition signifie supprimer tous les éléments indiqués par un zéro correspondant dans l'argument de gauche et commencer une nouvelle partition chaque fois que le nombre correspondant dans l'argument de gauche est supérieur à son prédécesseur, c'est-à-dire sur chacun si l'argument de gauche est booléen, comme c'est le cas ici.


0

R, 8 octets (2 voies)

R a deux fonctions intégrées qui répondent aux exigences de ce défi:

strsplit

prend un vecteur de chaînes et un séparateur, et renvoie une liste de vecteurs des chaînes séparées.

read.csv

prend un nom de fichier et un séparateur, et renvoie un bloc de données. Techniquement, cela peut être de 10 octets car il a besoin de l'option header=Fpour ne pas lire les premiers éléments comme noms de colonne. Actuellement, le lien TIO lit depuis stdin.

Essayez-les en ligne!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.