Basit CSV / DSV ithalatçısı


12

Bir ters biraz daha fazla bu .

In:  Çok satırlı DSV verileri ve tek bir sınırlayıcı karakter. DSV bir dosya, bir dosya adı, satır sonu ayrılmış dize, dizeler listesi vb. Olarak alınabilir. Tüm kayıtlar aynı sayıda alana sahiptir ve boş alan yoktur. Veriler sınırlayıcı karakteri içermez ve tırnak işareti veya kaçış mekanizması yoktur.

Çıkış:  DSV'yi temsil eden bir veri yapısı, örneğin bir dizi dizge listesi veya bir dizgi matrisi.

Örnekler

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

["hello;\"","\";world","\";\""]ve ";":
[["hello","\""],["\"","world"],["\"","\""]](bu örnek JSON kullandığından kaçar)

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


Yani sadece açıklığa kavuşturmak için, her bir kalemi verilen karakterlerin örneklerine böldük?
ETHproductions

@ETHproductions Doğru.
Adám

İlk veya son karakter sınırlayıcıysa dizeleri nasıl ayırmalıyız? ",for,example,this,string,"
GB

@GB alan yok boş
Adám

Yani bunun olmayacağını varsayabiliriz?
GB

Yanıtlar:


3

Jöle , 3 2 bayt

Dennis işaret 2 bayt çözüm değil işi, kendisi yapar diyadik linki ve bu görünürken aslında yolu komut satırı argümanları bu şekilde görünmesi o işlendiğinden olduğunu.

ṣ€

Çevrimiçi Deneyin! - altbilgi, sol ve sağ açıkça ayarlanmış olarak işlevi çağırır ve bir ızgara olarak biçimlendirir *.

Tam olarak aşağıda olduğu gibi, alt argümanlar doğru argümana eşit değil, sağ argüman oluşumunda bölünmeler hariç .


œṣ€

3 Byter - altbilgi görüntüler ızgara * olarak sonucu.

Soldaki DSV listesini ve sağdaki ayırıcıyı alan bir ikili bağlantı (işlev).

Nasıl?

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

* Tam bir program olarak, örtük çıktı sadece tüm karakterleri "smush" olurdu, bu nedenle TIO bağlantı altbilgisi bağlantı bir ikili olarak çağırır Gve sonucu güzel biçimlendirmek için kullanır .


@Okx örtük çıktı basitçe tüm karakterleri "
smush

@Okx Evet, bir liste döndüren bir işlevdir. Altbilgi, tam bir program olarak çalıştırıldığında oluşan örtük çıktıyı geçersiz kılmaktır.
Jonathan Allan

7

Japt , 3 bayt

mqV

Çevrimiçi test edin! ( -QÇıktıyı yeniden yazdırmak için bayrağı kullanır )

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

: Ey bir JSGL dövdü MATL!
Mart'ta Downgoat

7

Powershell, 25 22/23 bayt

İki seçenek, biri ilk argümanında bölünmüş çağrılar, ikinci argümanı bir delim değeri olarak kullanır.

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

CSV'yi ayrıştırmak için yerleşik bir bayt daha uzun, dosya adını ilk argüman olarak alır ve ikinci olarak sınırlandırır.

ipcsv $args[0] $args[1]

-2 çünkü -Delimiter( -D) parametresini gerektirmez ve varsayılan olarak kabul eder.

ne yazık ki powershell iki parametre dizisini geçemez, çünkü her iki dosya olduğunu varsayar ve komutu iki kez çalıştırır, başka hiçbir iki değişkenli giriş yöntemi görebildiğim kadar kısa değildir, bu muhtemelen mümkün olan en kısa cevap.

ipcsviçin bir takma Import-Csvaddır, ilk adsız giriş olarak bir dosya adı alır ve varsayılan davranış tarafından ikincisi olarak delim karakteri alır.

Wiki sayfasının getirdiği örnekten kaçının

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 bayt

import Data.Lists
map.splitOn

Kullanım örneği: (map.splitOn) " " ["to be or not","that is the question"]-> [["to","be","or","not"],["that","is","the","question"]].




4

Mathematica, 11 bayt

StringSplit

Yerleşik işlev iki argüman, dizelerin listesi ve bir karakter (ve bundan daha genel). Örnek kullanım:

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

verim

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

4

MATLAB / Oktav, 41 25 bayt

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

ansİlk girişi dizelerin hücre dizisi ve ikinci girdiyi dize olarak kabul eden adlı anonim bir işlev oluşturur .

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

Çevrimiçi Deneyin


4

Cheddar, 19 bayt

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

Döngü yeteneklerinin güzel bir gösteri. Yeni kompozisyon ekledim ve f.op. böylece ilginç golf sağlar blokları. (=>:@.split)çalışması gerekiyordu ama çalışmıyor :(


3

MATL, 14 12 4 bayt

H&XX

MATL Online'da deneyin (bağlantının sonunda çıkış hücresi dizisinin boyutsallığını göstermek için bir değişiklik vardır).

açıklama

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

l~l./

Açıklama:

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

1

'-N' kullanarak Ruby, 17 + 1 = 18 bayt

p chomp.split *$*

Nasıl çalışır

  • Dosyadan giriş
  • ayırıcı komut satırı parametresi olarak verilir
  • sadece 1 parametremiz olduğundan, *$*dizeyi uyarır ve onusplit işlev
  • Ben kaçınmaya çalıştım chompama başka herhangi bir çözüm bundan daha uzun gibi görünüyor.


1

GNU sed , 48 + 1 (r bayrağı) = 49 bayt

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

Çevrimiçi deneyin!

Sed'de veri türü yoktur, ancak bir listenin doğal bir temsili bir satır koleksiyonu olacaktır. Bu nedenle, girdi biçimi, her biri ayrı bir satırdaki DSV kayıtlarından oluşur ve ayırıcı ilk satırda bulunur.

Açıklama: tasarım gereği sed, girdi satırları kadar komut dosyasını çalıştırır

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 bayt

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

Bağımsız değişken olarak bir dosya adı ve bir sınırlayıcı alır, dosya içeriği kök haline getirilir o.


Bütün bu boşluk gerçekten gerekli mi?
Mart'ta Adedi

Hayır, sadece okunabilirlik için girintilendirdim. Bayt sayısı girintisiz kod içindir.
17'de

REXX'in hangi lezzeti bu?
Mart'ta Adeam

Saf ANSI REXX olduğunu düşünüyorum. Sadece Regina ile test ettim.
17'de

1
TIO'ya

0

APL (Dyalog) , 4 bayt

15.0'a kadar olan ve bu sürümleri içeren sürümlerde, ⎕ML←3birçok kişi için varsayılan olan bu gereksinim vardır. 16.0 sürümünden sadece aynı etki için .

Ayırıcıyı sol argüman ve DSV'yi sağ argüman olarak alır.

≠⊂¨⊢

Çevrimiçi deneyin!

 eşitsizlikler (sol argüman ve sağ argüman)

⊂¨ her birini böl

 doğru argüman

Bölümleme, sol bağımsız değişkende karşılık gelen sıfır ile gösterilen tüm öğeleri kaldırmak ve sol bağımsız değişkende karşılık gelen bir sayı öncekinden büyük olduğunda, yani sol bağımsız değişken Boolean ise her birinde yeni bir bölüm başlatmak anlamına gelir. burada durum böyle.


0

R, 8 bayt (2 yol)

R, bu zorluğun gereksinimlerini karşılayan iki yerleşik işleve sahiptir:

strsplit

dizelerin bir vektörünü ve ayırıcıyı alır ve ayrılmış dizelerin vektörlerinin bir listesini döndürür.

read.csv

bir dosya adı ve ayırıcı alır ve bir veri çerçevesi döndürür. Teknik olarak bu 10 bayt olabilir, çünkü seçeneğe ihtiyaç duyar, header=Fböylece ilk öğeleri sütun adları olarak okumaz. Şu anda TIO bağlantısı stdin'den okuyor.

Bunları çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.