Pengimpor CSV / DSV sederhana

12

Sedikit lebih dari kebalikan dari ini .

Dalam: data DSV  multi-line dan karakter pembatas tunggal. DSV dapat diambil sebagai file, nama file, string yang dipisahkan baris, daftar string, dll. Semua catatan memiliki jumlah bidang yang sama, dan tidak ada bidang yang kosong. Data tidak mengandung karakter pembatas dan tidak ada mekanisme penawaran atau pelarian.

Keluar:  Struktur data yang mewakili DSV, misalnya daftar daftar string atau matriks string.

Contohnya

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

["hello;\"","\";world","\";\""]dan ";":
[["hello","\""],["\"","world"],["\"","\""]](lolos karena contoh ini menggunakan JSON)

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

Adm
sumber
Jadi hanya untuk memperjelas, kami cukup membagi setiap item pada contoh karakter yang diberikan?
ETHproduksi
@ ETHproductions Benar.
Adám
Bagaimana seharusnya kita membagi string jika karakter pertama atau terakhir adalah pembatas? ",for,example,this,string,"
GB
@ GB tidak ada bidang kosong
Adám
Jadi kita bisa berasumsi itu tidak akan terjadi?
GB

Jawaban:

3

Jelly , 3 2 byte

Dennis menunjukkan bahwa sementara solusi 2 byte tampaknya tidak berfungsi, tautan diad itu sendiri berfungsi, dan bahwa sebenarnya cara argumen baris perintah diuraikan yang membuatnya terlihat seperti itu.

ṣ€

Cobalah secara Online! - footer memanggil fungsi dengan set kiri dan kanan secara eksplisit, dan memformat sebagai kisi *.

Persis seperti di bawah ini, kecuali terpecah pada kemunculan argumen yang benar dan bukan pada sublist yang sama dengan argumen yang benar.


œṣ€

The 3 byter - footer menampilkan hasil sebagai grid *.

Link diad (fungsi) yang mengambil daftar DSV di sebelah kiri dan pembatas di sebelah kanan.

Bagaimana?

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

* Sebagai program lengkap, output implisit hanya akan "smush" bersama semua karakter, sehingga footer dari tautan TIO menyebut tautan tersebut sebagai angka dua dan digunakan Guntuk memformat hasilnya dengan baik.

Jonathan Allan
sumber
@Okx output tersirat hanya akan "smush" bersama semua karakter
Adám
@ OK Ya, ini adalah fungsi yang mengembalikan daftar. Footer adalah untuk menimpa output implisit yang terjadi ketika dijalankan sebagai program lengkap.
Jonathan Allan
7

Japt , 3 byte

mqV

Uji secara online! (Menggunakan -Qbendera untuk mencetak pracetak keluaran)

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
Produksi ETH
sumber
: O seorang JSGL mengalahkan MATL!
Downgoat
7

Powershell, 25 22/23 byte

Dua Opsi, satu hanya memanggil split pada arg pertama, menggunakan arg kedua sebagai nilai batas.

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

Satu byte lagi, dibangun untuk mem-parsing csvs, menggunakan nama file sebagai arg pertama dan delim sebagai yang kedua.

ipcsv $args[0] $args[1]

-2 karena tidak memerlukan param -Delimiter( -D), dan akan menganggapnya secara default.

sayangnya PowerShell tidak dapat melewati array dari dua params, karena akan menganggap mereka berdua file, dan akan menjalankan perintah terhadapnya dua kali, tidak ada metode input dua-var lainnya lebih pendek dari ini sejauh yang saya bisa lihat, jadi ini mungkin jawaban sesingkat mungkin.

ipcsvadalah alias untuk Import-Csv, mengambil nama file sebagai input tanpa nama pertama, dan karakter delim sebagai yang kedua secara default.

Jalankan melawan contoh dari pengembalian halaman 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
sumber
6

Python, 33 byte

lambda a,c:[x.split(c)for x in a]
Trelzevir
sumber
5

Haskell, 29 byte

import Data.Lists
map.splitOn

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

nimi
sumber
4

05AB1E , 5 byte

vy²¡ˆ

Cobalah online!

Penjelasan:

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

JavaScript, 26 byte

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

Menerima input dalam format (array string) (pembatas)

Cobalah online!

fəˈnɛtɪk
sumber
4

Mathematica, 11 byte

StringSplit

Fungsi builtin mengambil dua argumen, daftar string dan karakter (dan bahkan lebih umum dari itu). Contoh penggunaan:

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

hasil panen

{{"to", "be", "or", "not"}, {"that", "is", "the", "question"}}
Greg Martin
sumber
4

MATLAB / Oktaf, 41 25 byte

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

Membuat fungsi anonim bernama ansyang menerima input pertama sebagai array sel string dan input kedua sebagai string.

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

Cobalah secara Online

Suever
sumber
4

Cheddar, 19 byte

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

demonstrasi yang bagus dari kemampuan pengulangan. Saya menambahkan komposisi baru dan f.op. blok sehingga memungkinkan untuk bermain golf yang menarik. (=>:@.split)seharusnya bekerja tetapi tidak :(

Downgoat
sumber
3

MATL, 14 12 4 byte

H&XX

Cobalah di MATL Online (tautan memiliki modifikasi di bagian akhir untuk menunjukkan dimensi array sel keluaran).

Penjelasan

        % 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
sumber
1

CJam, 5 byte

l~l./

Penjelasan:

l~     e#Input evaluated (as list)
  l    e#Another line of input
   ./  e#Split first input by second
Roman Gräf
sumber
1

Ruby menggunakan '-n', 17 + 1 = 18 byte

p chomp.split *$*

Bagaimana itu bekerja

  • Masukan dari file
  • pemisah diberikan sebagai parameter baris perintah
  • karena kita hanya memiliki 1 parameter, *$*percikan string dan kita dapat menggunakannya sebagai parameter untuk splitfungsi
  • Saya mencoba menghindari chomptetapi solusi lain sepertinya lebih lama dari ini.
GB
sumber
1

Rebol, 33 byte

func[b s][map-each n b[split n s]
draegtun
sumber
1

GNU sed , 48 +1 (r flag) = 49 byte

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

Cobalah online!

Sed tidak ada tipe data, tetapi representasi alami dari daftar akan menjadi kumpulan garis. Dengan demikian, format input terdiri dari catatan DSV masing-masing pada baris yang terpisah, dengan pembatas hadir pada baris pertama.

Penjelasan: menurut desain, sed menjalankan skrip sebanyak yang ada baris input

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

REXX, 95 byte

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

Mengambil nama file dan pembatas sebagai argumen, isi file diletakkan di batang o.

idrougge
sumber
Apakah semua ruang putih itu benar-benar diperlukan?
Adám
Tidak, saya hanya membuat lekukan untuk dibaca. Hitungan byte adalah untuk kode yang tidak diindentifikasi.
idrougge
Rasa REXX manakah ini?
Adam
Saya pikir itu murni ANSI REXX. Saya hanya mengujinya dengan Regina.
idrougge
0

APL (Dyalog) , 4 byte

Dalam versi hingga dan termasuk 15.0, ini kebutuhan ⎕ML←3yang standar oleh banyak orang. Dari versi 16.0 bisa diganti dengan untuk efek yang sama.

Mengambil pemisah sebagai argumen kiri dan DSV sebagai argumen kanan.

≠⊂¨⊢

Cobalah online!

 ketidaksetaraan (argumen kiri dan argumen kanan)

⊂¨ partisi masing-masing

 argumen yang benar

Dengan partisi berarti untuk menghapus semua elemen yang ditunjukkan oleh nol yang sesuai dalam argumen kiri, dan memulai partisi baru setiap kali angka yang sesuai dalam argumen kiri lebih besar dari pendahulunya, yaitu pada setiap elemen jika argumen kiri adalah Boolean, seperti yang terjadi di sini.

Adm
sumber
0

R, 8 byte (2 cara)

R memiliki dua fungsi bawaan yang memenuhi persyaratan tantangan ini:

strsplit

mengambil vektor string dan pemisah, dan mengembalikan daftar vektor string yang dipisahkan.

read.csv

mengambil nama file dan pemisah, dan mengembalikan bingkai data. Secara teknis ini mungkin 10 byte karena membutuhkan opsi header=Fsehingga tidak akan membaca elemen pertama sebagai nama kolom. Saat ini tautan TIO dibaca dari stdin.

Coba ini secara online!

Giuseppe
sumber