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"]]


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.


@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

: 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


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"]].




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"}}

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


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 :(


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

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

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.


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)

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.


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.


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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.