प्रत्येक सीएसवी रिकॉर्ड में फ़ील्ड की संख्या की गणना करें


12

एक पाठ फ़ाइल की कल्पना करें जहां प्रत्येक सीएसवी रिकॉर्ड में विभिन्न संख्या के क्षेत्र हो सकते हैं। कार्य कोड को आउटपुट में लिखना है कि फ़ाइल के प्रत्येक रिकॉर्ड में कितने फ़ील्ड हैं। आप मान सकते हैं कि फ़ाइल में कोई हेडर लाइन नहीं है और आप फ़ाइल या मानक इनपुट से पढ़ सकते हैं, जैसा कि आप चुनते हैं।

आप csv नियमों के लिए rfc4180 का एक संस्करण मान सकते हैं, जो मैं फ़ाइल की प्रत्येक पंक्ति की परिभाषा के लिए नीचे बताऊंगा । यहाँ कल्पना के प्रासंगिक भाग का एक हल्का संपादित संस्करण है:

सीएसवी प्रारूप की परिभाषा

  1. प्रत्येक रिकॉर्ड एक अलग लाइन पर स्थित होता है, जिसे लाइन ब्रेक (CRLF) द्वारा सीमांकित किया जाता है। उदाहरण के लिए:

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

  2. फ़ाइल का अंतिम रिकॉर्ड एंडिंग लाइन ब्रेक हो सकता है या नहीं। उदाहरण के लिए:

    aaa,bbb,ccc CRLF
    zzz,yyy,xxx

(नियम 3. इस चुनौती में लागू नहीं होता है)

  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

आप किसी भी तरह से आउटपुट मान दे सकते हैं जो आपको सबसे सुविधाजनक लगता है।

पुस्तकालय

आप अपनी पसंद की किसी भी लाइब्रेरी का उपयोग कर सकते हैं।


अब तक बहुत बढ़िया जवाब लेकिन हमें एक कमांड लाइन / बैश उत्तर याद आ रहा है जो विशेष रूप से अच्छा होगा।

जवाबों:


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: मैंने कुछ और जानकारी जोड़ी है।
पुनरावर्ती

4

आर , 40 बाइट्स

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

इसे ऑनलाइन आज़माएं!

के प्रलेखन के अनुसार count.fields, लाइन विराम वाले क्षेत्रों को प्रारंभिक पंक्ति के लिए NA की फ़ील्ड गणना मिलती है, इसलिए हम उन्हें फ़िल्टर करते हैं।


3

जावास्क्रिप्ट (ES2018), 42 59 बाइट्स

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


तकनीकी रूप से यह ईएस २०१ due sरेगेक्स पर ध्वज के कारण है । ऐसा नहीं है कि यह बहुत मायने रखता है ;-) और इसका अच्छा उपयोग, btw!
ETHproductions

2
यह फ़ंक्शन केवल एक समय में एक रिकॉर्ड पर काम करने के लिए प्रकट होता है। मुझे लगता है कि समस्या वर्णन के लिए कई रिकॉर्ड्स की संपूर्ण फ़ाइल को संभालने की आवश्यकता होती है।
पुनरावर्ती

@ETHproductions, अच्छी बात है, अद्यतन करेगा।
रिक हिचकॉक

@recursive, आप सही कह रहे हैं, मुझे जानकारी गलत लगी है। अब कई बाइट्स के नुकसान पर अपडेट किया गया है ।
रिक हिचकॉक

3

जेली , 12 बाइट्स

ṣ”"m2FỴ=”,§‘

पुनरावर्ती के स्टैक्स उत्तर का एक बंदरगाह - क्रेडिट दें!

इसे ऑनलाइन आज़माएं!

कैसे?

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

पायथन, 63 बाइट्स

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

पुनरावृत्त mapवस्तु में आउटपुट देता है ।


2
एक lambdaफ़ंक्शन का उपयोग करके आप इसे 54 बाइट्स
ओव्स

@ मुझे नियम समझ में नहीं आ रहे हैं लेकिन लगता है कि आपके टीआईओ ने इनपुट से पहले तैयारी की है। क्या यह वास्तव में वैध है?
अनुष

मैं देखता हूं कि यह अब क्यों काम करता है (@ ASCII- केवल के लिए धन्यवाद)।
अनुष्का



2

जावा 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.