각 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. 각 레코드 내에 쉼표로 구분 된 하나 이상의 필드가있을 수 있습니다. 공백은 필드의 일부로 간주되므로 무시해서는 안됩니다.

  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

Stax , 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
어떻게 작동합니까?
Anush

1
@Anush : 더 많은 정보를 추가했습니다.
재귀


3

자바 스크립트 (ES2018), 42 59 바이트

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


기술적으로 이것은 s정규식 의 플래그 로 인해 ES2018 입니다. 그다지 중요하지는 않습니다. ;-) 잘 사용합니다.
ETHproductions

2
이 기능은 한 번에 하나의 레코드에서만 작동하는 것으로 보입니다. 문제 설명에 여러 레코드의 전체 파일을 처리해야한다고 생각합니다.
재귀

좋은 점은 @ETHproductions가 업데이트됩니다.
Rick Hitchcock

@ 재귀, 당신 말이 맞아, 나는 입력을 오해했다. 많은 바이트 가 손실되면 업데이트 됩니다.
Rick Hitchcock

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

파이썬, 63 바이트

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

반복 가능한 map객체 의 출력을 반환 합니다.


2
lambda함수를 사용 하면 이것을 54 바이트
ovs

@ovs 규칙을 이해하지 못할 수도 있지만 TIO가 입력을 준비한 것 같습니다. 정말 유효합니까?
Anush

왜 이것이 작동하는지 알 수 있습니다 (@ASCII 전용 덕분).
Anush


2

Perl 5.10.0, 55 53 바이트

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

온라인으로 사용해보십시오!

설명:

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

자바 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.