シンプルなCSV / DSVインポーター


12

これの逆以上に少し。

In:  複数行のDSVデータと単一の区切り文字。DSVは、ファイル、ファイル名、改行で区切られた文字列、文字列のリストなどとして取得できます。すべてのレコードには同じ数のフィールドがあり、空のフィールドはありません。データには区切り文字が含まれておらず、引用やエスケープのメカニズムはありません。

Out:  DSVを表すデータ構造。たとえば、文字列のリストのリストまたは文字列のマトリックス。

["here is,some,sample","data,delimited,by commas"]および","
[["here is","some","sample"],["data","delimited","by commas"]]

["hello;\"","\";world","\";\""]および";":(
[["hello","\""],["\"","world"],["\"","\""]]この例ではJSONを使用しているためエスケープ)

["to be or not","that is the question"]および" "
[["to","be","or","not"],["that","is","the","question"]]


したがって、明確にするために、指定されたcharのインスタンスで各項目を単純に分割しますか?
ETHproductions

@ETHproductionsそうです。
アダム

最初または最後の文字が区切り文字である場合、どのように文字列を分割する必要がありますか? ",for,example,this,string,"
GB

@GB フィールドは空ではありません
アダム

それで、それは起こらないと仮定できますか?
GB

回答:


3

ゼリー3 2 バイト

デニスは指摘する 2バイトのソリューションではなく、仕事に表示されます進リンク自体はありません、それが実際にコマンドライン引数は、それがそのように見えるようにその解析されている方法であるとしながら、ということ。

ṣ€

オンラインでお試しください!-フッターは、左右を明示的に設定して関数を呼び出し、グリッドとしてフォーマットします*。

以下とまったく同じです。ただし、右の引数に等しいサブリストではなく、右の引数の出現で分割します。


œṣ€

byter 3 -フッターは、グリッドとして結果*を表示します。

左側のDSVリストと右側の区切り文字を使用するダイアディックリンク(関数)。

どうやって?

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

*完全なプログラムとして、暗黙的な出力はすべての文字を単に「スマッシュ」するため、TIOリンクのフッターはリンクをダイアドとして呼び出しG、結果を適切にフォーマットするために使用します。


@Okx 暗黙の出力は、すべての文字を単純に「スマッシュ」します
アダム

@Okxはい、これはリストを返す関数です。フッターは、完全なプログラムとして実行されたときに発生する暗黙的な出力をオーバーライドします。
ジョナサンアラン


7

Powershell、25 22/23バイト

2つのオプション、1つは最初の引数でsplitを呼び出し、2番目の引数をdelim値として使用します。

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

csvsを解析するために組み込まれた1バイトより長いファイル名は、最初の引数としてファイル名を取り、2番目としてデリムを取ります。

ipcsv $args[0] $args[1]

-2 -Delimiter((-D)paramを必要とせず、デフォルトで想定するため)。

悲しいことに、PowerShellは2つのパラメータの配列を渡すことができません。両方のファイルであると想定し、それに対してコマンドを2回実行するため、他の2変数入力メソッドはこれよりも短いので、これはおそらくそうです最短の答え。

ipcsvはのエイリアスでImport-Csv、ファイル名を名前のない最初の入力として使用し、デリム文字をデフォルトの動作として2番目として使用します。

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

2つの引数、文字列のリストおよび文字(さらにそれよりも一般的)を受け取る組み込み関数。使用例:

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

利回り

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

4

MATLAB /オクターブ、41 25バイト

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

ans最初の入力を文字列のセル配列として受け入れ、2番目の入力を文字列として受け入れるという名前の匿名関数を作成します。

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

オンラインで試す


4

チェダー、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

「-n」を使用したRuby、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

引数としてファイル名と区切り文字を取り、ファイルの内容はstemに入れられますo


そのすべての空白は本当に必要ですか?
アダム

いいえ、読みやすくするためにインデントしただけです。バイトカウントは、インデントされていないコード用です。
-idrougge

これはREXXのどのフレーバーですか?
アダム

純粋なANSI REXXだと思います。レジーナでのみテストしました。
-idrougge


0

APL(ダイアログ)、4バイト

15.0以前のバージョンでは、これが必要です ⎕ML←3では、多くの人がデフォルトとします。バージョン16.0以降は、は、同じ効果を得るためます。

左引数としてセパレータを、右引数としてDSVを使用します。

≠⊂¨⊢

オンラインでお試しください!

 (左引数と右引数の)不等式

⊂¨ 各パーティション

 正しい議論

パーティションとは、左の引数の対応するゼロで示されるすべての要素を削除し、左の引数の対応する数がその前身よりも大きい場合、つまり左の引数がブール値の場合はすべて、新しいパーティションを開始することを意味しますここがその例です。


0

R、8バイト(2ウェイ)

Rには、この課題の要件を満たす2つの組み込み関数があります。

strsplit

文字列のベクトルとセパレータを受け取り、分離された文字列のベクトルのリストを返します。

read.csv

ファイル名とセパレータを受け取り、データフレームを返します。技術header=F的には、列名として最初の要素を読み取らないオプションが必要なため、これは10バイトかもしれません。現在、TIOリンクはstdinから読み取ります。

これらをオンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.