Trình nhập CSV / DSV đơn giản


12

Hơi nhiều hơn một nghịch đảo của điều này .

Trong: Dữ liệu DSV  nhiều dòng và một ký tự phân cách đơn. DSV có thể được lấy dưới dạng tệp, tên tệp, chuỗi phân tách ngắt dòng, danh sách các chuỗi, v.v ... Tất cả các bản ghi có cùng số trường và không có trường nào trống. Dữ liệu không chứa ký tự phân cách và không có cơ chế trích dẫn hoặc thoát.

Out:  Cấu trúc dữ liệu đại diện cho DSV, ví dụ: danh sách các danh sách các chuỗi hoặc ma trận của các chuỗi.

Ví dụ

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

["hello;\"","\";world","\";\""]";":
[["hello","\""],["\"","world"],["\"","\""]](thoát vì ví dụ này sử dụng JSON)

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


Vì vậy, để làm rõ, chúng ta chỉ cần phân chia từng mục trong các trường hợp của char đã cho?
Sản xuất ETH

@ETHproductions Đúng vậy.
Adám

Làm thế nào chúng ta nên phân chia các chuỗi nếu ký tự đầu tiên hoặc cuối cùng là dấu phân cách? ",for,example,this,string,"
GB

@GB không có trường nào trống
Adám

Vì vậy, chúng ta có thể cho rằng nó sẽ không xảy ra?
GB

Câu trả lời:


3

Thạch , 3 2 byte

Dennis chỉ ra rằng trong khi giải pháp 2 byte dường như không hoạt động, thì chính liên kết dyadic thực hiện và đó thực sự là cách các đối số dòng lệnh được phân tích cú pháp khiến nó trông như vậy.

ṣ€

Dùng thử trực tuyến! - chân trang gọi hàm với trái và phải được đặt rõ ràng và định dạng dưới dạng lưới *.

Chính xác như dưới đây, ngoại trừ phân tách tại các lần xuất hiện của đối số đúng thay vì tại danh sách con bằng với đối số đúng.


œṣ€

Các 3 byter - chân hiển thị kết quả như một mạng lưới *.

Một liên kết dyadic (chức năng) lấy danh sách DSV ở bên trái và dấu phân cách ở bên phải.

Làm sao?

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

* Là một chương trình đầy đủ, đầu ra ngầm sẽ chỉ đơn giản là "làm mờ" tất cả các ký tự, vì vậy chân trang của liên kết TIO gọi liên kết là một dyad và sử dụng Gđể định dạng kết quả độc đáo.


@Okx đầu ra ngầm sẽ chỉ đơn giản là "làm mờ" tất cả các ký tự
Adám

@Okx Có nó là một hàm trả về một danh sách. Chân trang là ghi đè đầu ra ẩn xảy ra khi nó được chạy dưới dạng một chương trình đầy đủ.
Jonathan Allan


7

Powershell, 25 22/23 byte

Hai Tùy chọn, một chỉ gọi tách trên arg thứ nhất, sử dụng arg thứ hai làm giá trị delim.

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

Một byte dài hơn, được dựng sẵn để phân tích csvs, lấy tên tệp là arg đầu tiên và delim là thứ hai.

ipcsv $args[0] $args[1]

-2 vì nó không yêu cầu tham số -Delimiter( -D) và sẽ mặc định sử dụng nó.

thật đáng buồn là powershell không thể vượt qua một mảng gồm hai params, vì nó sẽ cho rằng chúng là cả hai tệp và sẽ chạy lệnh chống lại nó hai lần, không có phương thức nhập hai var nào khác ngắn hơn tôi có thể thấy, vì vậy điều này có khả năng Câu trả lời ngắn nhất có thể.

ipcsvlà một bí danh cho Import-Csv, lấy tên tệp làm đầu vào không tên đầu tiên và ký tự delim làm thứ hai theo hành vi mặc định.

Chạy ngược lại ví dụ từ trang wiki trả về

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 byte

import Data.Lists
map.splitOn

Ví dụ sử dụng: (map.splitOn) " " ["to be or not","that is the question"]-> [["to","be","or","not"],["that","is","the","question"]].




4

Toán học, 11 byte

StringSplit

Hàm dựng sẵn lấy hai đối số, một danh sách các chuỗi và một ký tự (và thậm chí còn tổng quát hơn thế). Ví dụ sử dụng:

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

sản lượng

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

4

MATLAB / Octave, 41 25 byte

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

Tạo một hàm ẩn danh có tên anschấp nhận đầu vào đầu tiên dưới dạng một mảng ô của chuỗi và đầu vào thứ hai dưới dạng chuỗi.

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

Dùng thử trực tuyến


4

Cheddar, 19 byte

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

trình diễn tốt đẹp của khả năng lặp. Tôi đã thêm thành phần mới và f.op. khối để cho phép chơi golf thú vị. (=>:@.split)được cho là hoạt động nhưng nó không :(


3

MATL, 14 12 4 byte

H&XX

Hãy thử tại MATL Online (liên kết có một sửa đổi ở cuối để hiển thị kích thước của mảng ô đầu ra).

Giải trình

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

l~l./

Giải trình:

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

1

Ruby sử dụng '-n', 17 + 1 = 18 byte

p chomp.split *$*

Làm thế nào nó hoạt động

  • Nhập từ tập tin
  • dấu phân cách được đưa ra như tham số dòng lệnh
  • vì chúng ta chỉ có 1 tham số, *$*nên chia chuỗi và chúng ta có thể sử dụng nó làm tham số cho splithàm
  • Tôi đã cố gắng tránh chompnhưng bất kỳ giải pháp nào khác dường như dài hơn thế này.


1

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

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

Hãy thử trực tuyến!

Trong sed không có kiểu dữ liệu, nhưng biểu diễn tự nhiên của danh sách sẽ là tập hợp các dòng. Như vậy, định dạng đầu vào bao gồm các bản ghi DSV trên mỗi dòng riêng biệt, với dấu phân cách hiện trên dòng đầu tiên.

Giải thích: theo thiết kế, sed chạy tập lệnh nhiều lần khi có các dòng đầu vào

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

Lấy tên tệp và dấu phân cách làm đối số, nội dung của tệp được đặt trong thân o.


Là tất cả khoảng trắng đó thực sự cần thiết?
Adám

Không, tôi chỉ thụt lề cho dễ đọc. Số byte là dành cho mã không được cấp phép.
idrougge

Hương vị nào của REXX này?
Adám

Tôi nghĩ đó là ANSI REXX thuần túy. Tôi chỉ thử nó với Regina.
idrougge


0

APL (Dyalog) , 4 byte

Trong các phiên bản lên đến và bao gồm 15.0, nhu cầu ⎕ML←3này được mặc định bởi nhiều người. Từ phiên bản 16.0 chỉ có thể được thay thế bằng hiệu ứng tương tự.

Lấy dấu phân cách làm đối số bên trái và DSV làm đối số bên phải.

≠⊂¨⊢

Hãy thử trực tuyến!

 bất đẳng thức (của đối số bên trái và đối số bên phải)

⊂¨ phân vùng mỗi

 lập luận đúng

Theo phân vùng có nghĩa là loại bỏ tất cả các phần tử được biểu thị bằng một số 0 tương ứng trong đối số bên trái và bắt đầu một phân vùng mới bất cứ khi nào một số tương ứng trong đối số bên trái lớn hơn so với tiền thân của nó, tức là trên mọi đối số nếu đối số bên trái là Boolean, như là trường hợp ở đây


0

R, 8 byte (2 cách)

R có hai hàm dựng sẵn đáp ứng các yêu cầu của thử thách này:

strsplit

lấy một vectơ của chuỗi và dấu phân cách và trả về một danh sách các vectơ của các chuỗi được tách.

read.csv

lấy tên tệp và dấu phân cách và trả về khung dữ liệu. Về mặt kỹ thuật, đây có thể là 10 byte vì nó cần tùy chọn header=Fnên nó sẽ không đọc các phần tử đầu tiên dưới dạng tên cột. Hiện tại liên kết TIO đọc từ stdin.

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.