Her csv kaydındaki alan sayısını sayın


12

Her csv kaydının farklı sayıda alana sahip olabileceği bir metin dosyası düşünün. Görev, dosyanın her kaydında kaç alan bulunduğunu göstermek için kod yazmaktır. Dosyada başlık satırı olmadığını ve istediğiniz gibi bir dosyadan veya standart girdiden okuyabileceğini varsayabilirsiniz.

Dosyanın her satırının tanımı için aşağıda açıklayacağım csv kuralları için rfc4180'in bir sürümünü varsayabilirsiniz . Spesifikasyonun ilgili bölümünün hafifçe düzenlenmiş bir versiyonu:

CSV Formatının Tanımı

  1. Her kayıt, satır sonu (CRLF) ile ayrılmış ayrı bir satırda bulunur. Örneğin:

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

  2. Dosyadaki son kaydın bir bitiş sonu kesmesi olabilir veya olmayabilir. Örneğin:

    aaa,bbb,ccc CRLF
    zzz,yyy,xxx

(Kural 3. bu sorun için geçerli değildir)

  1. Her kayıtta, virgülle ayrılmış bir veya daha fazla alan olabilir. Boşluklar bir alanın parçası olarak kabul edilir ve göz ardı edilmemelidir.

  2. Her alan çift tırnak içine alınabilir veya alınmayabilir. Alanlar çift tırnak içine alınmazsa, alanların içinde çift tırnak görünmeyebilir. Örneğin:

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

  3. Satır sonu (CRLF), çift tırnak ve virgül içeren alanlar çift tırnak içine alınmalıdır. Örneğin:

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

  4. Alanları kapatmak için çift tırnak işareti kullanılıyorsa, alanın içinde görünen çift tırnaktan önce başka bir çift tırnak işareti kullanılmalıdır. Örneğin:

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

Misal

Giriş:

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

Çıktı vermelidir:

2, 3, 3, 5

Çıkış değerlerini en uygun bulduğunuz şekilde verebilirsiniz.

Kütüphaneler

İstediğiniz herhangi bir kütüphaneyi kullanabilirsiniz.


Şimdiye kadar harika yanıtlar ama özellikle harika olacak bir komut satırı / bash cevabı eksik.

Yanıtlar:


5

Stax , 19 12 bayt

èJ§3‼}vAà○L>

Çalıştır ve hata ayıkla

Ambalajından çıkarılmış, golf edilmemiş ve yorum yapılmış gibi görünüyor.

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

Bunu çalıştır


1
O nasıl çalışır?
Anush

1
@Anush: Biraz daha bilgi ekledim.
tekrarlayan

4

R , 40 bayt

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

Çevrimiçi deneyin!

Başına belgelere ait count.fields, satır sonları alanlar ilk hat için NA'nın bir saha sayısı elde, bu yüzden onları filtre.


3

JavaScript (ES2018), 42 59 bayt

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


Teknik olarak bu sregex üzerindeki bayrak nedeniyle ES2018 . O kadar önemli değil ;-) Ve güzel kullanımı, btw!
ETHproductions

2
Bu işlev aynı anda yalnızca bir kayıt üzerinde çalışıyor gibi görünüyor. Ben sorun açıklaması birden fazla kayıt bir dosya işleme gerektirir düşünüyorum.
özyinelemeli

@ETHproductions, iyi bir nokta, güncellenecektir.
Rick Hitchcock

@ recursive, haklısın, girdileri yanlış anladım. Şimdi, birçok bayt kaybında güncellendi .
Rick Hitchcock

3

Jöle , 12 bayt

ṣ”"m2FỴ=”,§‘

Bir bağlantı noktası özyinelemenin Stax cevap - git kredi ver!

Çevrimiçi deneyin!

Nasıl?

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

Belki tercih edersiniz ṣ”"m2ẎỴċ€”,‘- sıkın ve ċ€her birinde virgül sayar.


2

Python, 63 bayt

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

Çıkarılabilir bir mapnesnede çıktıyı döndürür .


2
Bir lambdaişlevi kullanarak bunu 54 bayta
ovs

@ovs Kuralları anlamayabilirim ama TIO'nuz girdiyi hazırlamış görünüyor. Bu gerçekten geçerli mi?
Anush

Neden şimdi çalıştığını görüyorum (yalnızca @ ASCII sayesinde).
Anush


2

Perl 5.10.0, 55 53 bayt

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

Çevrimiçi deneyin!

Açıklama:

$_=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

2

Java 10, 101 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

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.