Prosty importer CSV / DSV

12

Nieco więcej niż odwrotność tego .

W:  multi-line DSV danych i pojedynczym znakiem ogranicznika. DSV można traktować jako plik, nazwę pliku, ciąg oddzielony od linii, listę ciągów itp. Wszystkie rekordy mają tę samą liczbę pól i żadne pole nie jest puste. Dane nie zawierają znaku ogranicznika i nie ma mechanizmu cytowania ani zmiany znaczenia.

Out:  struktura danych reprezentująca DSV, np. Lista list ciągów lub macierz ciągów.

Przykłady

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

["hello;\"","\";world","\";\""]i ";":
[["hello","\""],["\"","world"],["\"","\""]](ucieka, ponieważ w tym przykładzie użyto JSON)

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

Adám
źródło
Czyli dla wyjaśnienia, po prostu dzielimy każdy element w instancjach danego znaku?
ETHprodukcje
@ETHproductions Zgadza się.
Adám
Jak powinniśmy rozdzielić łańcuchy, jeśli pierwszym lub ostatnim znakiem jest separator? ",for,example,this,string,"
GB
@GB żadne pole nie jest puste
Adám
Możemy więc założyć, że tak się nie stanie?
GB

Odpowiedzi:

3

Galaretka , 3 2 bajty

Dennis zwraca uwagę, że chociaż wydaje się, że rozwiązanie 2-bajtowe nie działa, to samo łącze diadadowe działa, i że tak naprawdę analizowane są argumenty wiersza poleceń, które sprawiają, że tak wygląda.

ṣ€

Wypróbuj online! - stopka wywołuje funkcję z wyraźnie ustawionym lewym i prawym formatem i formatuje jako siatkę *.

Dokładnie jak poniżej, z wyjątkiem podziałów w przypadku wystąpienia właściwego argumentu, a nie na listy podrzędne równe prawidłowemu argumentowi.


œṣ€

Do 3 byter - stopce wyświetla wynik w postaci siatki. *

Dyadyczny link (funkcja), który pobiera listę DSV po lewej stronie i separator po prawej stronie.

W jaki sposób?

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

* Jako pełny program wynik niejawny po prostu „zmiażdży” wszystkie znaki, więc stopka łącza TIO wywołuje łącze jako diadę i Gładnie formatuje wynik.

Jonathan Allan
źródło
@Okx domyślny wynik po prostu „zmiażdży” wszystkie postacie
Adám
@Okx Tak, jest to funkcja zwracająca listę. Stopka ma zastąpić niejawne wyjście, które pojawia się, gdy jest uruchamiane jako pełny program.
Jonathan Allan
7

Japt , 3 bajty

mqV

Przetestuj online! (Używa -Qflagi do wydrukowania wydruku)

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
ETHprodukcje
źródło
: O, JSGL pokonał MATL!
Downgoat
7

PowerShell, 25 22/23 bajtów

Dwie opcje, jedna po prostu wywołuje podział pierwszego argumentu, używając drugiego argumentu jako wartości delim.

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

Jeden bajt dłużej, wbudowany w parsowanie csvs, przyjmuje nazwę pliku jako pierwszy argument, a separator jako drugi.

ipcsv $args[0] $args[1]

-2, ponieważ nie wymaga parametru -Delimiter( -D) i domyślnie go przyjmuje.

Niestety, PowerShell nie może przekazać tablicy dwóch parametrów, ponieważ zakłada, że ​​oba są plikami, i uruchomi komendę dwa razy, żadna inna metoda wprowadzania dwóch zmiennych nie jest krótsza niż ta, o ile widzę, więc jest to prawdopodobne najkrótsza możliwa odpowiedź.

ipcsvjest aliasem dla Import-Csv, przyjmuje nazwę pliku jako pierwsze nienazwane wejście, a znak separatora jako drugie zachowanie domyślnie.

Uruchom na przykładzie ze zwrotów strony 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
colsw
źródło
6

Python, 33 bajty

lambda a,c:[x.split(c)for x in a]
Trelzevir
źródło
5

Haskell, 29 bajtów

import Data.Lists
map.splitOn

Przykład użycia: (map.splitOn) " " ["to be or not","that is the question"]-> [["to","be","or","not"],["that","is","the","question"]].

nimi
źródło
4

05AB1E , 5 bajtów

vy²¡ˆ

Wypróbuj online!

Wyjaśnienie:

v     For each element in the input array
 y    Push the element
  ²   Push second input
   ¡  Split
    ˆ Add to array
Okx
źródło
4

JavaScript, 26 bajtów

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

Odbiera dane wejściowe w formacie (tablica ciągów) (separator)

Wypróbuj online!

Fəˈnɛtɪk
źródło
4

Mathematica, 11 bajtów

StringSplit

Wbudowana funkcja pobierająca dwa argumenty, listę ciągów znaków i znak (a nawet bardziej ogólny). Przykładowe użycie:

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

daje

{{"to", "be", "or", "not"}, {"that", "is", "the", "question"}}
Greg Martin
źródło
4

MATLAB / Octave, 41 25 bajtów

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

Tworzy anonimową funkcję o nazwie, ansktóra akceptuje pierwsze dane wejściowe jako tablicę komórek ciągów, a drugie dane wejściowe jako ciąg znaków.

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

Wypróbuj online

Suever
źródło
4

Cheddar, 19 bajtów

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

niezła prezentacja umiejętności zapętlania. Dodałem nową kompozycję i np. bloki, co pozwala na ciekawe gry w golfa. (=>:@.split)powinien działać, ale nie działa :(

Downgoat
źródło
3

MATL, 14 12 4 bajtów

H&XX

Wypróbuj go w MATL Online (link ma modyfikację na końcu, aby pokazać wymiarowość wyjściowej tablicy komórek).

Wyjaśnienie

        % 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
źródło
1

CJam, 5 bajtów

l~l./

Wyjaśnienie:

l~     e#Input evaluated (as list)
  l    e#Another line of input
   ./  e#Split first input by second
Roman Gräf
źródło
1

Ruby używa „-n”, 17 + 1 = 18 bajtów

p chomp.split *$*

Jak to działa

  • Dane wejściowe z pliku
  • separator podano jako parametr wiersza poleceń
  • ponieważ mamy tylko 1 parametr, *$*dzieli łańcuch i możemy go użyć jako parametru dla splitfunkcji
  • Próbowałem tego uniknąć, chompale każde inne rozwiązanie wydaje się być dłuższe.
GB
źródło
1

Rebol, 33 bajty

func[b s][map-each n b[split n s]
draegtun
źródło
1

GNU sed , 48 + 1 (flaga r) = 49 bajtów

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

Wypróbuj online!

W sed nie ma żadnych typów danych, ale naturalną reprezentacją listy byłby zbiór linii. Jako taki format wejściowy składa się z rekordów DSV, każdy w osobnej linii, z separatorem obecnym w pierwszym wierszu.

Objaśnienie: z założenia sed uruchamia skrypt tyle razy, ile jest linii wejściowych

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
źródło
1

REXX, 95 bajtów

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

Jako argument przyjmuje nazwę pliku i separator, zawartość pliku jest umieszczana w rdzeniu o.

idrougge
źródło
Czy cała ta spacja jest naprawdę konieczna?
Adám
Nie, naciąłem tylko na czytelność. Liczba bajtów odnosi się do kodu bez wcięć.
idrougge
Jaki to smak REXX?
Adám
Myślę, że to czysty ANSI REXX. Testowałem to tylko z Reginą.
idrougge
0

APL (Dyalog) , 4 bajty

W wersjach do 15.0 włącznie, wymaga ⎕ML←3to domyślnie wielu. Od wersji 16.0 można po prostu zastąpić przez dla tego samego efektu.

Traktuje separator jako lewy argument, a DSV jako prawy argument.

≠⊂¨⊢

Wypróbuj online!

 nierówności (lewego i prawego argumentu)

⊂¨ podziel każdy

 słuszny argument

Przez podział oznacza usunięcie wszystkich elementów wskazanych przez odpowiednie zero w lewym argumencie i rozpoczęcie nowej partycji za każdym razem, gdy odpowiednia liczba w lewym argumencie jest większa niż jego poprzednik, tj. Na każdym, jeśli lewy argument jest logiczny, ponieważ tak jest w tym przypadku.

Adám
źródło
0

R, 8 bajtów (2 sposoby)

R ma dwie wbudowane funkcje, które spełniają wymagania tego wyzwania:

strsplit

pobiera wektor ciągów i separator i zwraca listę wektorów oddzielonych ciągów.

read.csv

pobiera nazwę pliku i separator i zwraca ramkę danych. Technicznie może to być 10 bajtów, ponieważ potrzebuje opcji, header=Fwięc nie odczyta pierwszych elementów jako nazw kolumn. Obecnie link TIO odczytuje ze standardowego wejścia.

Wypróbuj je online!

Giuseppe
źródło