Hitung jumlah bidang dalam setiap catatan csv

12

Bayangkan file teks di mana setiap record csv mungkin memiliki jumlah bidang yang berbeda. Tugasnya adalah menulis kode untuk menampilkan berapa banyak bidang yang ada di setiap catatan file. Anda dapat menganggap tidak ada baris tajuk dalam file dan dapat membaca dari file atau input standar, seperti yang Anda pilih.

Anda dapat mengasumsikan versi rfc4180 untuk aturan csv yang akan saya jelaskan di bawah ini untuk definisi setiap baris file. Berikut ini adalah versi ringan dari bagian yang relevan dari spesifikasi:

Definisi Format CSV

  1. Setiap catatan terletak pada jalur yang terpisah, dibatasi oleh pemutusan jalur (CRLF). Sebagai contoh:

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

  2. Catatan terakhir dalam file mungkin atau mungkin tidak memiliki jeda baris akhir. Sebagai contoh:

    aaa,bbb,ccc CRLF
    zzz,yyy,xxx

(Aturan 3. tidak berlaku dalam tantangan ini)

  1. Dalam setiap catatan, mungkin ada satu atau lebih bidang, dipisahkan dengan koma. Spasi dianggap sebagai bagian dari bidang dan tidak boleh diabaikan.

  2. Setiap bidang mungkin atau mungkin tidak dilampirkan dalam tanda kutip ganda. Jika bidang tidak disertai dengan tanda kutip ganda, maka tanda kutip ganda mungkin tidak muncul di dalam bidang. Sebagai contoh:

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

  3. Bidang yang berisi penghentian baris (CRLF), tanda kutip ganda, dan koma harus dilampirkan dalam tanda kutip ganda. Sebagai contoh:

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

  4. Jika tanda kutip ganda digunakan untuk menyertakan bidang, maka tanda kutip ganda yang muncul di dalam bidang harus diloloskan dengan mendahului dengan tanda kutip ganda lainnya. Sebagai contoh:

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

Contoh

Memasukkan:

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

Harus memberikan output:

2, 3, 3, 5

Anda dapat memberikan nilai output dengan cara apa pun yang menurut Anda paling nyaman.

Perpustakaan

Anda dapat menggunakan perpustakaan apa pun yang Anda suka.


Sejauh ini jawaban yang luar biasa tetapi kami kehilangan jawaban baris perintah / bash yang akan sangat keren.

Anush
sumber

Jawaban:

5

Stax , 19 12 byte

èJ§3‼}vAà○L>

Jalankan dan debug itu

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

_'"/    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

Jalankan yang ini

rekursif
sumber
1
Bagaimana cara kerjanya?
Anush
1
@Anush: Saya telah menambahkan beberapa informasi lebih lanjut.
rekursif
4

R , 40 byte

(x=count.fields(stdin(),","))[!is.na(x)]

Cobalah online!

Per dokumentasi dari count.fields, bidang dengan jeda baris mendapatkan hitungan bidang NA untuk garis awal, jadi kami menyaring mereka keluar.

Giuseppe
sumber
3

JavaScript (ES2018), 42 59 byte

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

Rick Hitchcock
sumber
Secara teknis ini adalah ES2018 karena sbendera pada regex. Bukan berarti itu penting ;-) Dan penggunaannya bagus, btw!
ETHproduk
2
Fungsi ini hanya berfungsi pada satu catatan pada satu waktu. Saya pikir deskripsi masalah memerlukan penanganan seluruh file dari beberapa catatan.
rekursif
@ ETHproduk, poin bagus, akan diperbarui.
Rick Hitchcock
@recursive, Anda benar, saya salah mengerti input. Sekarang diperbarui, dengan kehilangan banyak banyak byte.
Rick Hitchcock
3

Jelly , 12 byte

ṣ”"m2FỴ=”,§‘

Port jawaban Stax rekursif - pergi berikan kredit!

Cobalah online!

Bagaimana?

ṣ”"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)

Mungkin Anda lebih suka ṣ”"m2ẎỴċ€”,‘- kencangkan dan ċ€hitung koma di masing-masing.

Jonathan Allan
sumber
2

Python, 63 byte

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

Mengembalikan output dalam mapobjek yang dapat diubah .

SlayerGames44
sumber
2
Dengan menggunakan lambdafungsi Anda bisa mendapatkan ini hingga 54 byte
ovs
@ovs Saya mungkin tidak mengerti aturannya tetapi TIO Anda tampaknya telah menyiapkan input. Apakah itu benar-benar valid?
Anush
Saya mengerti mengapa ini bekerja sekarang (hanya berkat @ ASCII).
Anush
2

Perl 5 .10.0, 55 53 byte

$_=shift;s/"(""|[^"])*"//g;s/^.*$/1+$&=~y:,::/gem;say

Cobalah online!

Penjelasan:

$_=shift;          # first command-line arg
s/"(""|[^"])*"//g; # remove quoted fields
s/^.*$/            # replace each line       
  1+$&=~y:,::      # by the number of commas plus 1
/gem;
say                # print
wastl
sumber
2

Java 10, 101 byte

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

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber