Importador simples de CSV / DSV


12

Um pouco mais que um inverso disso .

In: dados DSV de  várias linhas e um único caractere delimitador. O DSV pode ser usado como arquivo, nome de arquivo, sequência separada por quebra de linha, lista de sequências, etc. Todos os registros têm o mesmo número de campos e nenhum campo está vazio. Os dados não contêm o caractere delimitador e não há mecanismo de citação ou escape.

Out:  Uma estrutura de dados representando o DSV, por exemplo, uma lista de listas de strings ou uma matriz de strings.

Exemplos

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

["hello;\"","\";world","\";\""]e ";":
[["hello","\""],["\"","world"],["\"","\""]](escapa porque este exemplo usa JSON)

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


Então, só para esclarecer, simplesmente dividimos cada item nas instâncias do caractere especificado?
ETHproductions

@ETHproductions Isso mesmo.
Adám 28/02

Como devemos dividir as strings se o primeiro ou o último caractere é o delimitador? ",for,example,this,string,"
GB

@GB nenhum campo está vazio
Adám

Então podemos assumir que isso não vai acontecer?
GB

Respostas:


3

Geléia , 3 2 bytes

Dennis ressalta que, embora a solução de 2 bytes pareça não funcionar, o próprio link diádico funciona e é, na verdade, a maneira como os argumentos da linha de comando são analisados ​​que a fazem parecer dessa maneira.

ṣ€

Experimente Online! - rodapé chama a função com esquerda e direita definidas explicitamente e formata como uma grade *.

Exatamente como o abaixo, exceto as divisões nas ocorrências do argumento correto e não nas sublistas iguais ao argumento correto.


œṣ€

O rodapé de 3 bytes exibe o resultado como uma grade *.

Um link diádico (função) que leva a lista DSV à esquerda e o delimitador à direita.

Quão?

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

* Como um programa completo, a saída implícita simplesmente "esmagaria" todos os caracteres, de modo que o rodapé do link TIO chama o link como díade e usa Gpara formatar bem o resultado.


@Okx a saída implícita seria simplesmente "Smush" juntos todos os personagens
Adám

@Okx Sim, é uma função que retorna uma lista. O rodapé deve substituir a saída implícita que ocorre quando é executada como um programa completo.
Jonathan Allan

7

Japonês , 3 bytes

mqV

Teste online! (Usa o -Qsinalizador para imprimir a saída)

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 venceu MATL!
Downgoat

7

Powershell, 25 22/23 bytes

Duas opções, uma apenas chama split no primeiro argumento, usando o segundo argumento como um valor delim.

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

Um byte a mais, incorporado para analisar csvs, leva o nome do arquivo como primeiro argumento e delimita como segundo.

ipcsv $args[0] $args[1]

-2 porque não requer o parâmetro -Delimiter( -D) e o assumirá por padrão.

Infelizmente, o powershell não pode passar uma matriz de dois parâmetros, pois assumirá que ambos são arquivos e executará o comando duas vezes; nenhum outro método de entrada com duas var é mais curto do que isso, tanto quanto eu vejo, então é provável a resposta mais curta possível.

ipcsvé um alias para Import-Csv, usa um nome de arquivo como a primeira entrada sem nome e o caractere delim como a segunda por comportamento padrão.

Executar contra o exemplo da página wiki retorna

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 bytes

import Data.Lists
map.splitOn

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


4

05AB1E , 5 bytes

vy²¡ˆ

Experimente online!

Explicação:

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


4

Mathematica, 11 bytes

StringSplit

Função incorporada que recebe dois argumentos, uma lista de cadeias e um caractere (e ainda mais geral que isso). Exemplo de uso:

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

rendimentos

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

4

MATLAB / Oitava, 41 25 bytes

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

Cria uma função anônima nomeada ansque aceita a primeira entrada como uma matriz de células e a segunda entrada como uma sequência.

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

Experimente Online


4

Queijo Cheddar, 19 bytes

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

boa demonstração de habilidades de loop. Eu adicionei nova composição e f.op. blocos de modo que permite golfe interessante. (=>:@.split)deve funcionar, mas não funciona :(


3

MATL, 14 12 4 bytes

H&XX

Experimente no MATL Online (o link tem uma modificação no final para mostrar a dimensionalidade da matriz de células de saída).

Explicação

        % 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 bytes

l~l./

Explicação:

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

1

Ruby usando '-n', 17 + 1 = 18 bytes

p chomp.split *$*

Como funciona

  • Entrada do arquivo
  • separador é fornecido como parâmetro de linha de comando
  • como temos apenas 1 parâmetro, *$*divide a string e podemos usá-la como parâmetro para a splitfunção
  • Tentei evitar, chompmas qualquer outra solução parece ser mais longa que isso.


1

GNU sed , 48 + 1 (sinalizador r) = 49 bytes

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

Experimente online!

No sed, não há tipos de dados, mas uma representação natural de uma lista seria uma coleção de linhas. Como tal, o formato de entrada consiste em registros DSV, cada um em uma linha separada, com o delimitador presente na primeira linha.

Explicação: por design, sed executa o script quantas vezes houver linhas de entrada

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

Pega um nome de arquivo e um delimitador como argumentos, o conteúdo do arquivo é colocado no radical o.


Todo esse espaço em branco é realmente necessário?
Adám 29/03/17

Não, eu apenas o recuei para facilitar a leitura. A contagem de bytes é para código não recuado.
Idragge

Que sabor do REXX é esse?
Adám 29/03/17

Eu acho que é puro ANSI REXX. Eu só testei com Regina.
Idragge


0

APL (Dyalog) , 4 bytes

Nas versões até 15.0, inclusive, isso precisa do ⎕ML←3padrão de muitos. A partir da versão 16.0 pode ser substituída apenas pelo mesmo efeito.

Leva o separador como argumento à esquerda e DSV como argumento à direita.

≠⊂¨⊢

Experimente online!

 as desigualdades (do argumento da esquerda e do argumento da direita)

⊂¨ particionar cada

 argumento certo

Por partição significa remover todos os elementos indicados por um zero correspondente no argumento esquerdo e iniciar uma nova partição sempre que o número correspondente no argumento esquerdo for maior que seu predecessor, ou seja, em cada um deles se o argumento esquerdo for booleano, como é o caso aqui.


0

R, 8 bytes (2 vias)

O R possui duas funções internas que atendem aos requisitos deste desafio:

strsplit

pega um vetor de cadeias e um separador e retorna uma lista de vetores das cadeias separadas.

read.csv

pega um nome de arquivo e um separador e retorna um quadro de dados. Tecnicamente, isso pode ter 10 bytes porque precisa da opção header=Fpara não ler os primeiros elementos como os nomes das colunas. Atualmente, o link do TIO lê de stdin.

Experimente estes online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.