首页 > 解决方案 > 将 csv 文件数据加载到表中

问题描述

创建的表如下:

source:([id:`symbol$()] ric:();source:();Date:`datetime$())
property:([id:`symbol$()] Value:())

然后我有两个.csv文件,其中包括两个表数据。

property.csv显示如下:

id,Value
TEST1,1
TEST2,2

source.csv显示如下:

id,ric,source,Date
1,TRST,QO,2017-07-07 11:42:30.603
2,TRST2,QOT,2018-07-07 11:42:30.603

现在,如何csv一次将文件数据加载到每个表中

标签: databasecsvkdb

解决方案


您可以使用 0: 加载分隔记录。https://code.kx.com/wiki/Reference/ZeroColon

该函数的最简单形式是(types; delimiter) 0: filehandle

类型应以其大写字母表示形式给出,每列一个或一个空格以忽略一列。例如,使用“SJ”source.csv表示我想在 id 列中读取符号,将 value 列读取为 long。

分隔符指定如何分隔每列,在您的情况下为逗号分隔值 (CSV)。您可以将分隔符作为字符串传递",",它将每一行视为数据的一部分并返回列的嵌套列表,您可以将其插入具有匹配架构的表中,也可以附加到标题上并手动翻转字典然后翻转得到一个像这样的表:flip `id`value!("IS";",") 0: `:test.txt

如果您将列标题作为 csv 中的第一行,您可以传递一个登记分隔符,该分隔符enlist ","然后将使用列标题并在 kdb 中返回一个以这些作为标题的表,如果您认为合适,您可以重命名该表。

由于您要读取的文件具有不同的列类型并且要放入其中,因此您可以创建一个函数来读取它们,例如

{x insert (y;enlist ",") 0:z}'[(`source;`property);("SSSP";"SJ");(`:source.csv;`:property.csv)]

这将允许您指定应创建的表的名称、列类型和文件的文件句柄。

我建议使用时间戳而不是(折旧的)日期时间,因为它存储为 long 而不是浮点数,因此比较不会有问题。


推荐阅读