简单的CSV / DSV导入器


12

略大于的倒数。

输入:  多行DSV数据和单个定界符。DSV可以视为文件,文件名,以换行符分隔的字符串,字符串列表等。所有记录的字段数均相同,并且没有字段为空。数据不包含定界符,也没有引用或转义机制。

Out:  表示DSV的数据结构,例如,字符串列表列表或字符串矩阵。

例子

["here is,some,sample","data,delimited,by commas"]","
[["here is","some","sample"],["data","delimited","by commas"]]

["hello;\"","\";world","\";\""]";":(
[["hello","\""],["\"","world"],["\"","\""]]转义,因为此示例使用JSON)

["to be or not","that is the question"]" "
[["to","be","or","not"],["that","is","the","question"]]


因此,为了澄清一下,我们只是在给定char实例处拆分每个项目?
ETHproductions '17

@ETHproductions是的。
亚当

如果第一个或最后一个字符是分隔符,我们应该如何分割字符串? ",for,example,this,string,"
GB

@GB 没有字段为空
亚当

所以我们可以假设它不会发生?
GB

Answers:


3

果冻3 2 字节

Dennis 指出,尽管2字节解决方案似乎不起作用,但是二进链接本身却起作用,并且实际上,解析命令行参数的方式使它看起来像这样。

ṣ€

在线试用!-页脚会显式地调用带有左和右设置的函数,并格式化为网格*。

如下所述,只是在出现右参数而不是等于右参数的子列表时拆分。


œṣ€

3个byter -页脚显示结果作为网格*。

双向链接(函数),左侧为DSV列表,右侧为定界符。

怎么样?

œṣ€ - Main link: list l, delimiter d
  € - for each item in l:
œṣ  -     split at occurrences of sublists equal to d

*作为一个完整的程序,隐式输出将简单地将所有字符“混入”,因此TIO链接的页脚将该链接称为dyad,并用于G很好地格式化结果。


@Okx 隐含的输出将只是“斯马什”在一起的所有字符
亚当

@Okx是的,它是一个返回列表的函数。页脚将覆盖作为完整程序运行时出现的隐式输出。
乔纳森·艾伦,

7

Japt,3个字节

mqV

在线测试!(使用-Q标志来漂亮地打印输出)

mqV  // Implicit: U, V = inputs
m    // Map each item in U by the following function:
 qV  //   Split the item at instances of V.
     // Implicit: output result of last expression

:O JSGL击败了MATL!
Downgoat'3

7

Powershell,25个 22/23字节

两个选项,一个仅在第一个arg上调用split,将第二个arg用作delim值。

$args[0]-split$args[1]

内置一个长为解析csvs的字节,将filename作为第一个arg,将delim作为第二个。

ipcsv $args[0] $args[1]

-2,因为它不需要-Delimiter-D)参数,并且默认情况下会采用它。

遗憾的是,powershell无法传递两个参数的数组,因为它将假定它们都是文件,并且将对其执行两次命令,据我所知,没有其他任何两个var输入方法比这更短了,所以这很可能尽可能短的答案。

ipcsv是的别名Import-Csv,默认情况下,将文件名作为第一个未命名的输入,将delim字符作为第二个。

从Wiki页面返回的示例运行

PS C:\Users\Connor\Desktop> .\csvparse.ps1 'example.csv' ','

Date     Pupil               Grade
----     -----               -----
25 May   Bloggs, Fred        C
25 May   Doe, Jane           B
15 July  Bloggs, Fred        A
15 April Muniz, Alvin "Hank" A


5

Haskell,29个字节

import Data.Lists
map.splitOn

用法示例:(map.splitOn) " " ["to be or not","that is the question"]-> [["to","be","or","not"],["that","is","the","question"]]




4

Mathematica,11个字节

StringSplit

带有两个参数的内置函数,一个字符串列表和一个字符(甚至比这更通用)。用法示例:

StringSplit[{"to be or not", "that is the question"}, " "]

产量

{{"to", "be", "or", "not"}, {"that", "is", "the", "question"}}

4

MATLAB /八度,41 25字节

@(x,d)regexp(x,d,'split')

创建一个名为的匿名函数ans,该函数接受第一个输入作为字符串的单元格数组,第二个输入作为字符串。

ans({'Hello World', 'How are you'}, ' ')

在线尝试


4

Cheddar,19个字节

a->b->a=>@.split(b)

循环能力的很好展示。我添加了新的成分和f.op。块,以便打高尔夫。(=>:@.split)应该可以工作,但不能:(


3

MATL,14 12 4字节

H&XX

MATL Online上尝试一下(该链接的末尾有修改以显示输出单元格的维数)。

说明

        % Implicitly grab the first input as a cell array of strings
        % Implicitly grab the delimiter as a string
H       % Push the number literal 2 to the stack
&XX     % Split the input at each appearance of the delimiter
        % Implicitly display the result

1

CJam,5个字节

l~l./

说明:

l~     e#Input evaluated (as list)
  l    e#Another line of input
   ./  e#Split first input by second

1

Ruby使用'-n',17 + 1 = 18个字节

p chomp.split *$*

怎么运行的

  • 来自文件的输入
  • 分隔符作为命令行参数给出
  • 因为我们只有1个参数,*$*所以将字符串放在splat中,我们可以将其用作split函数的参数
  • 我试图避免,chomp但是任何其他解决方案似乎都比这更长。


1

GNU sed,48 + 1(r标志)= 49字节

1h;1d
:
G
/,$/bp
s:(.)(.*)\n\1:,\2:
t
:p;s:..$::

在线尝试!

在sed中,没有数据类型,但是列表的自然表示形式是行的集合。这样,输入格式由DSV记录组成,每个记录都在单独的行上,而分隔符出现在第一行上。

说明:按照设计,sed运行脚本的次数与输入行的次数相同

1h;1d                  # store delimiter, start new cycle
:                      # begin loop
G                      # append saved delimiter
/,$/bp                 # if delimiter is ',', skip replacements and go to printing
s:(.)(.*)\n\1:,\2:     # replace first occurrence of delimiter with ','
t                      # repeat
:p;s:..$::             # print label: delete appended delimiter (implicit printing)

1

REXX,95个字节

arg f d
do l=1 while lines(f)
    n=linein(f)
    do #=1 while n>''
        parse var n w (d) n
        o.l.#=w
    end
end

以文件名和定界符作为参数,文件内容放在stem中o


所有这些空格真的必要吗?
2015年

不,我只是为了便于阅读而缩进。字节数用于未缩进的代码。
idrougge

这是REXX的哪种口味?
亚当

我认为这是纯ANSI REXX。我只在Regina上进行过测试。
idrougge


0

APL(Dyalog),4个字节

在15.0及以下版本中,这⎕ML←3是许多默认设置。从16.0版开始,可以替换为相同的效果。

将分隔符作为左参数,将DSV作为右参数。

≠⊂¨⊢

在线尝试!

 (左参数和右参数的不等式)

⊂¨ 每个分区

 正确的论点

分区是指删除左参数中相应零所指示的所有元素,并在左参数中的对应数大于其前任值时开始新分区,即,如果左参数为布尔值,则对每个元素进行新分区,例如就是这种情况。


0

R,8个字节(2种方式)

R有两个内置函数可以满足这一挑战的要求:

strsplit

接受一个字符串向量和一个分隔符,并返回一个被分隔字符串向量的列表。

read.csv

采用文件名和分隔符,并返回数据帧。从技术上讲,这可能是10个字节,因为它需要此选项,header=F因此它不会读取第一个元素作为列名。当前,TIO链接从stdin中读取。

在线尝试这些!

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.