各CSVレコード内のフィールドの数を数える


12

各csvレコードのフィールド数が異なるテキストファイルを想像してください。タスクは、ファイルの各レコードにあるフィールドの数を出力するコードを記述することです。ファイルにヘッダー行がなく、選択に応じてファイルまたは標準入力から読み込むことができると想定できます。

ファイルの各行の定義について以下で説明するcsvルール用のrfc4180のバージョンを想定できます。以下は、仕様の関連部分を軽く編集したバージョンです。

CSV形式の定義

  1. 各レコードは、改行(CRLF)で区切られた個別の行に配置されます。例えば:

    aaa,bbb,ccc CRLF
    zzz,yyy,xxx CRLF

  2. ファイルの最後のレコードには、終了改行が含まれる場合と含まれない場合があります。例えば:

    aaa,bbb,ccc CRLF
    zzz,yyy,xxx

(ルール3はこのチャレンジには適用されません)

  1. 各レコード内には、コンマで区切られた1つ以上のフィールドがあります。スペースはフィールドの一部と見なされるため、無視しないでください。

  2. 各フィールドは、二重引用符で囲まれていてもいなくてもかまいません。フィールドが二重引用符で囲まれていない場合、フィールド内に二重引用符が表示されない場合があります。例えば:

    "aaa","bbb","ccc" CRLF
    zzz,yyy,xxx

  3. 改行(CRLF)、二重引用符、およびコンマを含むフィールドは、二重引用符で囲む必要があります。例えば:

    "aaa","b CRLF
    bb","ccc" CRLF
    zzz,yyy,xxx

  4. 二重引用符を使用してフィールドを囲む場合、フィールド内に表示される二重引用符は、その前に別の二重引用符を付けてエスケープする必要があります。例えば:

    "aaa","b""bb","ccc"

入力:

,"Hello, World!"
"aaa","b""bb","ccc"
zzz,yyy,
"aaa","b 
bb","ccc","fish",""

出力を与える必要があります:

2, 3, 3, 5

最も便利な方法で出力値を指定できます。

図書館

任意のライブラリを使用できます。


これまでのところ素晴らしい答えですが、特にクールなコマンドライン/ bashの回答がありません。

回答:


5

スタックス19 12 バイト

èJ§3‼}vAà○L>

実行してデバッグする

開梱されていない、コメントされていない、これはこのように見えます。

_'"/    split *all* of standard input by double quote characters
2::     keep only the even numbered elements
|j      split on newlines (implicitly concatenates array of "strings")
m       for each line, execute the rest of the program and output
  ',#^  count the number of commas occurring as substrings, and increment

これを実行する


1
どのように機能しますか?
アヌーシュ

1
@Anush:さらに情報を追加しました。
再帰的


3

JavaScript(ES2018)、42 59バイト

s=>s.replace(/".+?"/sg).split`\n`.map(c=>c.split`,`.length)


技術的にはs、正規表現のフラグのため、これはES2018 です。それはそれほど重要ではありません;-)そしてそれをうまく使うこと、ところで!
ETHproductions

2
この関数は、一度に1つのレコードでのみ機能するようです。問題の説明には、複数のレコードのファイル全体を処理する必要があると思います。
再帰的

@ETHproductions、良い点は更新されます。
リックヒッチコック

@再帰、あなたは正しい、私は入力を誤解しました。多数のバイトが失われたため、更新されました。
リックヒッチコック

3

ゼリー、12 バイト

ṣ”"m2FỴ=”,§‘

再帰的なポートのStax回答 -クレジットを与えてください!

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

どうやって?

ṣ”"m2FỴ=”,§‘ - Link: list of characters, V
 ”"          - a double quote character = '"'
ṣ            - split (V) at ('"')
   m2        - modulo slice with two (1st, 3rd, 5th, ... elements of that)
     F       - flatten list of lists to a list
      Ỵ      - split at newlines
        ”,   - comma character = ','
       =     - equal? (vectorises)
          §  - sum each
           ‘ - increment (vectorises)
             - (as a full program implicit print)

たぶんあなたが好むṣ”"m2ẎỴċ€”,‘- タイトであり、それぞれのカンマċ€カウントします。


2

Python、63バイト

import csv
def f(s):return map(len,csv.reader(s.split("\n"))

反復可能なmapオブジェクトで出力を返します。


2
lambda関数を使用すると、これを54バイト
減らす

@ovsルールは理解できませんが、TIOは入力を事前解析しているようです。それは本当に有効ですか?
アヌーシュ

なぜ今動作するのかわかります(@ASCIIのみのおかげです)。
アヌーシュ



2

Java 10、101バイト

s->{for(var p:s.replaceAll("\"[^\"]*\"","x").split("\n"))System.out.println(p.split(",",-1).length);}

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

説明:

s->{                                    // Method with String parameter and no return-type
  for(var p:s.replaceAll("\"[^\"]*\"","x") 
                                        //  Replace all words within quotes with an "x"
             .split("\n"))              //  Then split by new-line and loop over them:
    System.out.println(p.split(",",-1)  //   Split the item by comma's
                        .length);}      //   And print the length of this array

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