计算每个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答案,这将特别酷。

Answers:


5

Stax19 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:我添加了更多信息。
递归

4

R,40个字节

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

在线尝试!

按照文件count.fields,换行领域获得NA的初始行的字段数,所以我们筛选出来。


3

JavaScript(ES2018),42 59字节

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


由于s正则表达式上的标志,从技术上讲这是ES2018 。并不是那么重要;-)好用了,顺便说一句!
ETHproductions

2
这项功能似乎只能一次处理一条记录。我认为问题描述需要处理多个记录的整个文件。
递归

好点,@ 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函数,您可以将其
压缩

@ovs我可能不理解规则,但是您的TIO似乎已经准备好输入。那真的有效吗?
Anush

我知道为什么它现在可以工作了(感谢@ ASCII-only)。
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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.