【问题标题】:Load csv file data into tables将 csv 文件数据加载到表中
【发布时间】:2018-06-29 03:09:57
【问题描述】:

创建的表如下:

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文件数据加载到每个表中一次

【问题讨论】:

    标签: database csv kdb


    【解决方案1】:

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

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

    类型应该以其大写字母表示形式给出,每列一个或一个空格以忽略一列。例如,在source.csv 中使用“SJ”意味着我想将 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 而不是 float,因此比较不会出现问题。

    【讨论】:

      【解决方案2】:

      您可以使用key 列出目录的内容;

      files: key `:.;     /get the contents of the dir
      files:files where files like "*.csv";    /filter the csv files
      m:`property.csv`source.csv!("SJ";"JSSZ");   /create the mappings for each csv file 
      {[f] .[first ` vs f;();:; (m@f;enlist csv) 0: hsym f]}each files 
      

      最后,加载each csv 文件;请注意这里的目录是'pwd',您可能需要在使用0:之前将目录路径添加到每个文件中@

      【讨论】:

      • whats the :m:property.csvsource.csv!("**";"****").why it still return property.csv`source.csv!("**";"****")
      • 由于您的 csv 标头不同,您可以指定如何加载单个 csv 文件。例如m:property.csvsource.csv!("SJ";"JSSZ")
      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 2015-03-21
      • 1970-01-01
      • 2017-06-03
      • 2016-04-17
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多