Простий імпортер CSV / DSV


12

Трохи більше, ніж зворотне цьому .

В:  Багаторядкові дані DSV та один розділовий символ. DSV може сприйматися як файл, ім'я файлу, рядок, розділений на розрив рядків, список рядків тощо. Усі записи мають однакову кількість полів, і жодне поле не порожнє. Дані не містять символу розмежувача, а також немає механізму цитування чи скасування.

Вихід:  Структура даних, що представляє DSV, наприклад, список списків рядків або матриця рядків.

Приклади

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

["hello;\"","\";world","\";\""]і ";":
[["hello","\""],["\"","world"],["\"","\""]](уникає, оскільки в цьому прикладі використовується JSON)

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


Отже, щоб уточнити, ми просто розділимо кожен елемент на екземпляри даної символи?
ETHproductions

@ETHproductions Правильно.
Адам

Як ми повинні розділити рядки, якщо перший або останній символ є роздільником? ",for,example,this,string,"
ГБ

@GB жодне поле не порожнє
Adám

Тож можна припустити, що цього не станеться?
ГБ

Відповіді:


3

Желе , 3 2 байти

Денніс зазначає, що, мабуть, 2-байтне рішення не працює, але саме діадієве посилання працює, і що насправді так розбираються аргументи командного рядка, які змушують його виглядати саме так.

ṣ€

Спробуйте в Інтернеті! - нижній колонтитул викликує функцію з лівим і правим набором явно і форматується як сітка *.

Точно так, як наведено нижче, за винятком розбиття при появі правильного аргументу, а не в списках, рівних правильному аргументу.


œṣ€

У 3 byter - колонтитул відображає результат у вигляді сітки *.

Дядічне посилання (функція), яке приймає список DSV зліва та роздільник справа.

Як?

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

* Як повноцінна програма, неявний вихід просто "збиває" всі символи, тому нижній колонтитул посилання TIO називає посилання як діаду і використовує Gдля форматування результату добре.


@Okx неявний вихід просто "зіб'є" всіх персонажів
Adám,

@Okx Так, це функція, яка повертає список. Нижній колонтитул - це перекриття неявного виводу, який виникає при його запуску як повноцінна програма.
Джонатан Аллан


7

Powershell, 25 22/23 байт

Два варіанти, один просто дзвінки розділити на перший аргумент, використовуючи другий аргумент як значення розмежування.

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

На один байт довше, вбудований для розбору csvs, приймає ім'я файлу як перший аргумент і розділяє як другий.

ipcsv $args[0] $args[1]

-2, оскільки він не вимагає -Delimiter( -D) парам, і вважатиме його за замовчуванням.

на жаль powershell не може передати масив з двох парам, оскільки буде припускати, що вони є обома файлами, і буде виконувати команду проти нього двічі, жоден інший метод введення двох вар не коротший, наскільки я бачу, так що це, ймовірно, найкоротша можлива відповідь.

ipcsvПсевдонім для Import-Csv, приймає ім'я файлу як перший безіменний вхід, а символ розмежування як другий за поведінкою за замовчуванням.

Запустити проти прикладу зі сторінки wiki return

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

Хаскелл, 29 байт

import Data.Lists
map.splitOn

Приклад використання: (map.splitOn) " " ["to be or not","that is the question"]-> [["to","be","or","not"],["that","is","the","question"]].




4

Математика, 11 байт

StringSplit

Вбудована функція, яка бере два аргументи, список рядків і символ (і навіть більш загальний, ніж цей). Приклад використання:

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

врожайність

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

4

MATLAB / Octave, 41 25 байт

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

Створюється ім'я анонімної функції, ansяке приймає перший вхід як масив рядків рядків, а другий - як рядок.

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

Спробуйте в Інтернеті


4

Чеддар, 19 байт

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

приємна демонстрація циклічних здібностей. Я додав новий склад і f.op. блоки, що дозволяє цікавий гольф. (=>:@.split)повинен працювати, але це не так :(


3

MATL, 14 12 4 байти

H&XX

Спробуйте це на MATL Online (посилання має модифікацію в кінці, щоб показати розмірність масиву вихідних комірок).

Пояснення

        % 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 байт

l~l./

Пояснення:

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

1

Рубі, використовуючи '-n', 17 + 1 = 18 байт

p chomp.split *$*

Як це працює

  • Введення з файлу
  • роздільник задається як параметр командного рядка
  • оскільки у нас є лише 1 параметр, *$*бризкає рядок, і ми можемо використовувати його як параметр для splitфункції
  • Я намагався уникати, chompале, здається, будь-яке інше рішення довше цього.


1

GNU sed , 48 + 1 (r прапор) = 49 байт

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

Спробуйте в Інтернеті!

У sed немає типів даних, але природним поданням списку було б сукупність рядків. Таким чином, формат введення складається з записів DSV, кожен на окремому рядку, причому роздільник є в першому рядку.

Пояснення: за задумом sed запускає сценарій стільки разів, скільки є рядків введення

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 байт

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

В якості аргументів бере ім’я файлу та роздільник, вміст файлу кладеться в стовбур o.


Чи справді потрібне все пробіли?
Adám

Ні, я лише розрізав це для читання. Кількість байтів призначена для необереженого коду.
idrougge

Який аромат REXX це?
Adám

Я думаю, що це чистий ANSI REXX. Я протестував це лише з Регіною.
idrougge


0

APL (Dyalog) , 4 байти

У версіях до 15.0 включно, це потребує ⎕ML←3багатьох за замовчуванням. З версії 16.0 можна просто замінити на той же ефект.

Візьме роздільник як лівий аргумент, а DSV - як аргумент правого.

≠⊂¨⊢

Спробуйте в Інтернеті!

 нерівності (лівий аргумент і правий аргумент)

⊂¨ розділ кожен

 правильний аргумент

Під розділом - це означає видалити всі елементи, позначені відповідним нулем у лівому аргументі, та почати новий розділ, коли відповідне число у лівому аргументі перевищує його попередника, тобто на кожному, якщо лівий аргумент булевий, як тут справа.


0

R, 8 байт (2 способи)

R має дві вбудовані функції, які відповідають вимогам цього завдання:

strsplit

приймає вектор рядків і роздільник і повертає список векторів відокремлених рядків.

read.csv

бере ім’я файлу та роздільник і повертає кадр даних. Технічно це може бути 10 байт, тому що йому потрібна опція, header=Fтому він не буде читати перші елементи як імена стовпців. В даний час посилання TIO читається з stdin.

Спробуйте ці онлайн!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.