Einfacher CSV / DSV-Import

12

Etwas mehr als eine Umkehrung davon .

In:  Mehrzeilige DSV- Daten und ein einzelnes Trennzeichen. Der DSV kann als Datei, Dateiname, durch Zeilenumbrüche getrennte Zeichenfolge, Liste von Zeichenfolgen usw. verwendet werden. Alle Datensätze haben die gleiche Anzahl von Feldern, und kein Feld ist leer. Daten enthalten kein Trennzeichen und es gibt keinen Anführungszeichen- oder Escape-Mechanismus.

Out:  Eine Datenstruktur, die den DSV darstellt, z. B. eine Liste von Listen von Zeichenfolgen oder eine Matrix von Zeichenfolgen.

Beispiele

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

["hello;\"","\";world","\";\""]und ";":
[["hello","\""],["\"","world"],["\"","\""]](Escapezeichen, da in diesem Beispiel JSON verwendet wird)

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

Adam
quelle
Um dies zu verdeutlichen, teilen wir einfach jedes Element in Instanzen des angegebenen Zeichens auf.
ETHproductions
@ETHproductions Das stimmt.
Adám
Wie sollen wir die Zeichenfolgen aufteilen, wenn das erste oder letzte Zeichen das Trennzeichen ist? ",for,example,this,string,"
GB
@ GB kein Feld ist leer
Adám
Also können wir davon ausgehen, dass es nicht passieren wird?
GB

Antworten:

3

Gelee , 3 2 Bytes

Dennis weist darauf hin, dass die 2-Byte-Lösung anscheinend nicht funktioniert, die dyadische Verknüpfung selbst jedoch und dass es tatsächlich die Art und Weise ist, wie Befehlszeilenargumente analysiert werden, die sie so aussehen lassen.

ṣ€

Probieren Sie es online! - footer ruft die Funktion mit explizit gesetztem left und right auf und formatiert sie als Raster *.

Genau wie unten, mit Ausnahme von Aufspaltungen beim Auftreten des richtigen Arguments und nicht bei Unterlisten, die dem richtigen Argument entsprechen.


œṣ€

Die 3-Byte- Fußzeile zeigt das Ergebnis als Raster * an.

Eine dyadische Verknüpfung (Funktion), die die DSV-Liste links und den Begrenzer rechts aufnimmt.

Wie?

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

* Als volles Programm würde die implizite Ausgabe einfach alle Zeichen "zusammenfassen", so dass die Fußzeile des TIO-Links den Link als Dyade aufruft und verwendet, Gum das Ergebnis schön zu formatieren.

Jonathan Allan
quelle
@Okx die implizite Ausgabe würde einfach alle Zeichen "zerschmelzen"
Adám
@Okx Ja, es ist eine Funktion, die eine Liste zurückgibt. In der Fußzeile wird die implizite Ausgabe überschrieben, die bei der Ausführung als vollständiges Programm auftritt.
Jonathan Allan
7

Japt , 3 Bytes

mqV

Online testen! (Verwendet das -QFlag, um die Ausgabe schön zu drucken.)

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
ETHproductions
quelle
: O ein JSGL Beat MATL!
Downgoat
7

Powershell, 25 22/23 Bytes

Zwei Optionen, von denen eine nur Split für das erste Argument aufruft und das zweite Argument als Trennwert verwendet.

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

Ein Byte länger, um csvs zu analysieren, nimmt Dateiname als erstes Argument und Delim als zweites.

ipcsv $args[0] $args[1]

-2, da der Parameter -Delimiter( -D) nicht erforderlich ist und standardmäßig verwendet wird.

Leider kann Powershell kein Array mit zwei Parametern übergeben, da davon ausgegangen wird, dass es sich um beide Dateien handelt, und der Befehl zweimal ausgeführt wird. Soweit ich sehe, ist keine andere Eingabemethode mit zwei Variablen kürzer als diese. Dies ist also wahrscheinlich die kürzest mögliche Antwort.

ipcsvist ein Alias ​​für Import-Csv, nimmt standardmäßig einen Dateinamen als erste unbenannte Eingabe und das Begrenzungszeichen als zweite.

Führen Sie gegen das Beispiel von der Wiki-Seite zurück

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
colsw
quelle
6

Python, 33 Bytes

lambda a,c:[x.split(c)for x in a]
Trelzevir
quelle
5

Haskell, 29 Bytes

import Data.Lists
map.splitOn

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

nimi
quelle
4

05AB1E , 5 Bytes

vy²¡ˆ

Probieren Sie es online!

Erläuterung:

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

JavaScript, 26 Bytes

x=>y=>x.map(n=>n.split(y))

Erhält Eingaben im Format (Array von Strings) (Trennzeichen)

Probieren Sie es online!

fəˈnəˈtɪk
quelle
4

Mathematica, 11 Bytes

StringSplit

Integrierte Funktion mit zwei Argumenten, einer Liste von Zeichenfolgen und einem Zeichen (und noch allgemeiner). Beispielverwendung:

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

Ausbeuten

{{"to", "be", "or", "not"}, {"that", "is", "the", "question"}}
Greg Martin
quelle
4

MATLAB / Octave, 41 25 Bytes

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

Erstellt eine anonyme Funktion mit dem Namen, ansdie die erste Eingabe als Zellenarray von Zeichenfolgen und die zweite Eingabe als Zeichenfolge akzeptiert.

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

Probieren Sie es online

Suever
quelle
4

Cheddar, 19 Bytes

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

schöne Demonstration der Looping-Fähigkeiten. Ich habe neue Komposition hinzugefügt und f.op. Blöcke, so dass interessante Golfen ermöglicht. (=>:@.split)soll funktionieren, tut es aber nicht :(

Downgoat
quelle
3

MATL, 14 12 4 Bytes

H&XX

Probieren Sie es bei MATL Online aus (der Link hat am Ende eine Änderung, um die Dimensionalität des Ausgabezellenarrays anzuzeigen).

Erläuterung

        % 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
Suever
quelle
1

CJam, 5 Bytes

l~l./

Erläuterung:

l~     e#Input evaluated (as list)
  l    e#Another line of input
   ./  e#Split first input by second
Roman Gräf
quelle
1

Ruby mit '-n', 17 + 1 = 18 Bytes

p chomp.split *$*

Wie es funktioniert

  • Eingabe aus Datei
  • Das Trennzeichen wird als Befehlszeilenparameter angegeben
  • Da wir nur 1 Parameter haben, *$*splattet der String und wir können ihn als Parameter für densplit Funktion verwenden
  • Ich habe versucht zu vermeiden, chompaber jede andere Lösung scheint länger zu dauern.
GB
quelle
1

Rebol, 33 Bytes

func[b s][map-each n b[split n s]
draegtun
quelle
1

GNU sed , 48 + 1 (r Flag) = 49 Bytes

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

Probieren Sie es online!

In sed gibt es keine Datentypen, aber eine natürliche Darstellung einer Liste wäre eine Sammlung von Zeilen. Als solches besteht das Eingabeformat aus DSV-Datensätzen, die sich jeweils in einer separaten Zeile befinden, wobei sich das Trennzeichen in der ersten Zeile befindet.

Erläuterung: sed führt das Skript standardmäßig so oft aus, wie Eingabezeilen vorhanden sind

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)
Seshoumara
quelle
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

Nimmt einen Dateinamen und ein Trennzeichen als Argumente, wird der Inhalt der Datei in den Stamm eingefügt o.

idrougge
quelle
Ist all dieses Leerzeichen wirklich notwendig?
Adám
Nein, ich habe es nur zur besseren Lesbarkeit eingerückt. Die Byteanzahl gilt für nicht eingerückten Code.
idrougge
Welcher Geschmack von REXX ist das?
Adám
Ich denke es ist ANSI REXX pur. Ich habe es nur mit Regina getestet.
idrougge
0

APL (Dyalog) , 4 Bytes

In Versionen bis einschließlich 15.0 wird dies ⎕ML←3von vielen als Standard benötigt . Ab Version 16.0 kann für den gleichen Effekt nur noch durch ersetzt werden .

Nimmt das Trennzeichen als linkes Argument und das DSV als rechtes Argument.

≠⊂¨⊢

Probieren Sie es online!

 die Ungleichungen (des linken und des rechten Arguments)

⊂¨ partitionieren

 richtiges argument

Unter Partition versteht man das Entfernen aller Elemente, die im linken Argument durch eine entsprechende Null gekennzeichnet sind, und das Starten einer neuen Partition, wenn die entsprechende Zahl im linken Argument größer ist als die des Vorgängers, dh bei jedem Argument, bei dem das linke Argument ein Boolescher Wert ist, als ist der Fall hier.

Adam
quelle
0

R, 8 Bytes (2 Wege)

R verfügt über zwei integrierte Funktionen, die die Anforderungen dieser Herausforderung erfüllen:

strsplit

Nimmt einen Vektor von Zeichenfolgen und ein Trennzeichen und gibt eine Liste von Vektoren der getrennten Zeichenfolgen zurück.

read.csv

Nimmt einen Dateinamen und ein Trennzeichen und gibt einen Datenrahmen zurück. Technisch sind dies möglicherweise 10 Bytes, da die Option erforderlich istheader=F damit die ersten Elemente nicht als Spaltennamen gelesen werden. Derzeit liest der TIO-Link von stdin.

Probieren Sie diese online!

Giuseppe
quelle