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

12

Чуть больше , чем инверсия этого .

В:  многострочные данные DSV и один символ-разделитель. DSV может быть принят как файл, имя файла, строка, разделенная переносом строки, список строк и т. Д. Все записи имеют одинаковое количество полей, и ни одно из полей не является пустым. Данные не содержат символ разделителя, и нет механизма цитирования или экранирования.

Out:  структура данных, представляющая 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
@ ГБ нет поля пусто
Адам
Таким образом, мы можем предположить, что этого не произойдет?
GB

Ответы:

3

Желе , 3 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

Japt , 3 байта

mqV

Проверьте это онлайн! (Использует -Qфлаг, чтобы распечатать результат)

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
источник
: О, JSGL побил МАТЛ!
Downgoat
7

Powershell, 25 22/23 байта

Два параметра, один просто вызывает split для первого аргумента, используя второй аргумент в качестве значения разделителя.

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

Один байт длиннее, встроенный для разбора csvs, принимает имя файла в качестве первого аргумента и делимита в качестве второго.

ipcsv $args[0] $args[1]

-2, потому что он не требует параметра -Delimiter( -D) и примет его по умолчанию.

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

ipcsvявляется псевдонимом для Import-Csv, принимает имя файла в качестве первого безымянного ввода и символ разделителя в качестве второго по умолчанию.

Запуск против примера из вики-страницы возвращает

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
источник
6

Python, 33 байта

lambda a,c:[x.split(c)for x in a]
Trelzevir
источник
5

Haskell, 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

Mathematica, 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'}, ' ')

Попробуйте онлайн

Suever
источник
4

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

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

Хорошая демонстрация циклических способностей. Я добавил новый состав и ф.оп. блоки, что позволяет интересно играть в гольф. (=>:@.split)должен работать, но это не так :(

Downgoat
источник
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
Suever
источник
1

CJam, 5 байтов

l~l./

Объяснение:

l~     e#Input evaluated (as list)
  l    e#Another line of input
   ./  e#Split first input by second
Роман Греф
источник
1

Ruby использует '-n', 17 + 1 = 18 байт

p chomp.split *$*

Как это устроено

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

Rebol, 33 байта

func[b s][map-each n b[split n s]
draegtun
источник
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)
seshoumara
источник
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

Принимает имя файла и разделитель в качестве аргументов, содержимое файла помещается в stem o.

idrougge
источник
Действительно ли все эти пробелы необходимы?
Адам
Нет, я сделал отступ только для удобства чтения. Количество байтов для кода с отступом.
idrougge
Какой это вкус REXX?
Адам
Я думаю, что это чистый ANSI REXX. Я только проверил это с Реджиной.
idrougge
0

APL (Дьялог) , 4 байта

В версиях до 15.0 включительно это необходимо, ⎕ML←3что по умолчанию многими. С версии 16.0 можно просто заменить на тот же эффект.

Принимает разделитель в качестве левого аргумента и DSV в качестве правого аргумента.

≠⊂¨⊢

Попробуйте онлайн!

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

⊂¨ разделить каждый

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

Под разделом подразумевается удаление всех элементов, обозначенных соответствующим нулем в левом аргументе, и начало нового раздела, когда соответствующее число в левом аргументе больше, чем его предшественник, т. Е. На каждом, если левый аргумент является логическим, как здесь дело

Адам
источник
0

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

R имеет две встроенные функции, которые отвечают требованиям этой задачи:

strsplit

принимает вектор строк и разделитель и возвращает список векторов разделенных строк.

read.csv

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

Попробуйте это онлайн!

Giuseppe
источник