Csv.Document

官方说明:

返回表形式的CSV文档内容。columns:如果指定了一个记录,且delimiter、extraValues、encoding为Null,则所有参数Delimiter、Columns、Encoding、CsvStyle和QuoteStyle都将从该记录中获取。delimiter可以采用单个字符或列表;如果未指定或为Null,则使用逗号。有关可选extraValues的支持值,请参阅ExtraValues.Type。encoding指定文本编码类型。
Csv.Document( source as any, optional columns as any, optional delimiter as any, optional extraValues as nullable number, optional encoding as nullable number) as table
 

解读:

若导入的文件为*.xlsx,*.xls等,请参照另一篇《Excel.Workbook》
本函数不仅适用于csv,同样适用于txt,csv和txt本质上都是一样的,同属文本文件。
第一参数为必填参数,类型为binary,通常是先使用File.Contents将csv文件解析为binary,然后再用Csv.Document将binary解析出来,比如= Csv.Document(File.Contents("C:\Users\rages\Desktop\csv\test1.csv"),[Delimiter=",", Columns=2, Encoding=65001, QuoteStyle=QuoteStyle.None])
第2-5参数为可选参数,其中第二参数为列数,一般情况下不填即返回所有列,但是有些情况如不指定列数可能会只返回一两列,所以先不填试试看,如显示不完整再数下源数据共有几列,填到第二参数。
第三参数为分隔符,常见的分隔符有逗号、空格、制表符等等,同样可以先不填看看结果,不填或null默认使用逗号,如果不正确再加上分隔符。
第四参数为多出列的处理,有3个枚举常量:ExtraValues.List,ExtraValues.Error,ExtraValues.Ignore,分别可以用0,1,2代替,意思就是如果源数据的列数超过指定列数,是返回列表还是报错还是忽略。比如源数据有很多列,但是我写= Csv.Document(File.Contents("C:\Users\rages\Desktop\csv\test1.csv"),1,",",0)第二参数只指定了1列,就会返回一个列表,超出的列就会全部放在这个list中。而如果填1就会因为超出列数而报错,填2就会忽略错误。这个参数知道下有它的存在就好了,实际上并没有什么卵用,有兴趣的话可以自己测试下。
第五参数为编码,同样可以先不填看结果,如果出现乱码再更改此参数,中文编码一般为936。
此函数特殊的地方是,当第三四五参数不填时,第二参数可以为一个recod,格式为[Columns= ,Encoding= ],如上面介绍的第一参数中的写法,大多数情况我们都会采用这种写法。
 

导入单文件:

别看参数这么多,又是这种写法又是那种写法的,实际上也没那么复杂,完全可以通过菜单栏的可视化界面操作自动生成公式,然后自己再改改就好了。自动生成的公式一般已经没什么问题了,只是最后一个QuoteStyle=QuoteStyle.None也基本没什么用,看不惯的可以干掉他,能接受的话就不用管。其他也没什么好说的,很简单。
 

合并文件夹:

用到该函数最多的还是在合并文件夹下的所有csv文件,在较旧的版本中直接点合并自动生成的公式尚能接受,但是在某个版本更新后,直接点击合并会多出示例文件等一大坨多余的查询和步骤,要逼死强迫症。

思路同Excel.Workbook一样,深化出[Content]列,使用List.Transform批量转换,最后再合并。但是该函数中并没有提升标题的参数,所以还需要在合并之前加一个提升标题的操作。

= Table.Combine(List.Transform(Folder.Files("C:\Users\rages\Desktop\csv")[Content],each Table.PromoteHeaders(Csv.Document(_,[Column=2,Encoding=936]))))

10 Replies to “Csv.Document”

  1. 没看明白,我想在= Table.Combine(List.Transform(Folder.Files("C:\Users\rages\Desktop\csv")[Content],each Table.PromoteHeaders(Csv.Document(_,[Column=2,Encoding=936]))))这一步操作的同时保留文件名列

  2. Csv.Document,对于字段内就含有逗号,再按逗号划分字段,就会导致字段分隔出错,施神可以好的解决办法?

  3. 施大神,你说QuoteStyle不重要。我补充下,其实很重要,我之前碰到了错行的坑,导致数据全乱了。这个就是我最近一次向你提的问题。在QQ群里大神们也没有给出个很好的解决方案。我研究了1天才发现是这个参数导致的。

    QuoteStyle有2个参数,应用所有换行符(QuoteStyle.None),忽略带引号的换行符(QuoteStyle.Csv),默认选的是应用所有换行符(QuoteStyle.None),就是这个参数导致错行。改成QuoteStyle.Csv后就完美的很,不会错行。
    大神研究下这个参数的更多细节,看看还有什么神奇功能没有发现。

    -----
    只是最后一个QuoteStyle=QuoteStyle.None也基本没什么用,看不惯的可以干掉他,能接受的话就不用管。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注