การนำเข้า 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"],["\"","\""]](Escape เนื่องจากตัวอย่างนี้ใช้ JSON)

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


ดังนั้นเพื่ออธิบายให้ชัดเจนเราแบ่งแต่ละรายการเป็นอินสแตนซ์ของอักขระที่กำหนด
ETHproductions

@ETHproductions ถูกต้องแล้ว
Adám

เราควรแยกสตริงอย่างไรถ้าอักขระตัวแรกหรือตัวสุดท้ายเป็นตัวคั่น? ",for,example,this,string,"
GB

@GB ไม่มีฟิลด์
Adám

ดังนั้นเราสามารถสรุปได้ว่ามันจะไม่เกิดขึ้น?
GB

คำตอบ:


3

เยลลี่ , 3 2 ไบต์

เดนนิสชี้ให้เห็นว่าในขณะที่วิธีการแก้ปัญหา 2 ไบต์ดูเหมือนจะไม่ทำงานลิงก์ dyadic ก็ทำเองและเป็นวิธีแยกวิเคราะห์บรรทัดคำสั่งที่แยกวิเคราะห์ซึ่งทำให้ดูเป็นอย่างนั้น

ṣ€

ลองออนไลน์! - ส่วนท้ายเรียกใช้ฟังก์ชันโดยตั้งค่าด้านซ้ายและขวาอย่างชัดเจนและจัดรูปแบบเป็นกริด *

ตรงตามด้านล่างยกเว้นการแยกที่เกิดขึ้นของการโต้แย้งที่ถูกต้องมากกว่าที่รายการย่อยเท่ากับการโต้แย้งที่ถูกต้อง


œṣ€

3 byter - ส่วนท้ายของการแสดงผลตามตาราง *

ลิงก์ dyadic (ฟังก์ชัน) ที่ใช้รายการ DSV ทางด้านซ้ายและตัวคั่นทางด้านขวา

อย่างไร?

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

* ในฐานะโปรแกรมเต็มรูปแบบเอาต์พุตโดยนัยจะเพียง "smush" รวมกันอักขระทั้งหมดดังนั้นส่วนท้ายของลิงก์ TIO เรียกลิงก์เป็น dyad และใช้Gในการจัดรูปแบบผลลัพธ์เป็นอย่างดี


@Okx การส่งออกโดยนัยจะเพียงแค่ "smush" ตัวละครทั้งหมดพร้อมกัน
Adám

@Okx ใช่มันเป็นฟังก์ชั่นที่ส่งกลับรายการ ส่วนท้ายคือการแทนที่เอาต์พุตโดยนัยที่เกิดขึ้นเมื่อรันเป็นโปรแกรมแบบเต็ม
Jonathan Allan


7

Powershell ขนาด25 22/23 ไบต์

สองตัวเลือกหนึ่งเพียงแค่เรียกแยกบน ARG แรกโดยใช้ ARG ที่สองเป็นค่า delim

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

หนึ่งไบต์อีกต่อไปบิวด์อินเพื่อแยก csvs ใช้ชื่อไฟล์เป็น ARG แรกและ delim เป็นวินาที

ipcsv $args[0] $args[1]

-2 เนื่องจากไม่ต้องการพารามิเตอร์-Delimiter( -D) และจะถือว่าเป็นค่าเริ่มต้น

น่าเสียดาย PowerShell ไม่สามารถผ่านอาร์เรย์ของสอง params ได้เนื่องจากมันจะถือว่าพวกเขาเป็นทั้งไฟล์และจะรันคำสั่งกับมันสองครั้งไม่มีวิธีอินพุตแบบสอง var อื่นใดจะสั้นกว่านี้เท่าที่ฉันเห็นดังนั้นจึงน่าจะเป็นเช่นนี้ คำตอบที่สั้นที่สุด

ipcsvเป็นชื่อแทนImport-Csvใช้ชื่อไฟล์เป็นอินพุตที่ไม่มีชื่อแรกและอักขระ delim เป็นอักขระตัวที่สองตามพฤติกรรมเริ่มต้น

รันกับตัวอย่างจากหน้า 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


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

ฟังก์ชั่น Builtin รับสองอาร์กิวเมนต์รายการของสตริงและตัวอักษร (และยิ่งกว่าทั่วไป) ตัวอย่างการใช้งาน:

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

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

Ruby โดยใช้ '-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เตม


ช่องว่างทั้งหมดนั้นจำเป็นจริงๆหรือ?
อดัม

ไม่ฉันแค่เยื้องมันเพื่อให้สามารถอ่านได้ จำนวนไบต์เป็นโค้ดที่ไม่มีการจดสิทธิบัตร
idrougge

รสชาติของ REXX นี้คืออะไร
Adám

ฉันคิดว่ามันบริสุทธิ์ ANSI REXX ฉันเพิ่งทดสอบกับ Regina
idrougge


0

APL (Dyalog) 4 ไบต์

ในเวอร์ชันสูงถึงและรวมถึง 15.0 ความต้องการนี้⎕ML←3ซึ่งเป็นค่าเริ่มต้นหลาย จากเวอร์ชัน 16.0 สามารถถูกแทนที่ด้วยเอฟเฟกต์เดียวกัน

ใช้ตัวคั่นเป็นอาร์กิวเมนต์ด้านซ้ายและ DSV เป็นอาร์กิวเมนต์ที่ถูกต้อง

≠⊂¨⊢

ลองออนไลน์!

 ความไม่เท่าเทียมกัน (ของอาร์กิวเมนต์ซ้ายและอาร์กิวเมนต์ขวา)

⊂¨ แต่ละพาร์ติชัน

 อาร์กิวเมนต์ที่ถูกต้อง

โดยพาร์ทิชันหมายถึงการลบองค์ประกอบทั้งหมดที่ระบุโดยศูนย์ที่สอดคล้องกันในอาร์กิวเมนต์ด้านซ้ายและเริ่มพาร์ติชันใหม่เมื่อใดก็ตามที่หมายเลขที่สอดคล้องกันในอาร์กิวเมนต์ด้านซ้ายมีค่ามากกว่ารุ่นก่อนของมันคือในทุก ๆ ถ้าอาร์กิวเมนต์ซ้ายคือบูลีน เป็นกรณีที่นี่


0

R, 8 ไบต์ (2 วิธี)

R มีสองฟังก์ชันในตัวที่ตอบสนองความต้องการของความท้าทายนี้:

strsplit

รับเวกเตอร์ของสตริงและตัวคั่นและส่งกลับรายการเวกเตอร์ของสตริงที่คั่น

read.csv

ใช้ชื่อไฟล์และตัวคั่นและส่งคืน data frame ในทางเทคนิคนี่อาจเป็น 10 ไบต์เพราะต้องการตัวเลือกheader=Fดังนั้นมันจะไม่อ่านองค์ประกอบแรกเป็นชื่อคอลัมน์ ขณะนี้ลิงก์ TIO อ่านจาก stdin

ลองออนไลน์เหล่านี้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.