【问题标题】:How can I load a CSV file with " as the delimiter in kdb?如何在 kdb 中加载以 " 作为分隔符的 CSV 文件?
【发布时间】:2020-04-22 14:27:55
【问题描述】:

如何加载带有" 分隔符的CSV 文件?见第 2 行。 dd 加载到 symbolCol,而不是 stringCol

$cat kdb.log
longCol"floatCol"symbolCol"stringCol
1"4"b"bb
2"5""dd

我正在加载

tab:("JFSS";enlist "\"") 0: `$"/home/..../kdb.log"

dd 被加载到 symbolCol 中,而不是 stringCol

q)tab
longCol floatCol symbolCol stringCol
------------------------------------
1       4        b         bb      
2       5        dd                
q)tab[`symbolCol]
`b`dd

【问题讨论】:

    标签: csv kdb


    【解决方案1】:

    这实际上看起来可能是解析器中的一个错误 - 值得与 Kx 团队一起提出。使用" 作为分隔符非常罕见,因此他们可能没有考虑到它。

    我能找到的唯一解决方法是将" 替换为更好的分隔符。理想情况下,您应该在 kdb 之外更改分隔符,但如果您必须在 kdb 中进行,您可以这样做:

    q)("JFSS";enlist",") 0: ssr[;"\"";","]each read0`$":/home/..../kdb.log"
    longCol floatCol symbolCol stringCol
    ------------------------------------
    1       4        b         bb
    2       5                  dd
    q)
    
    

    使用永远不会出现在文件中的分隔符。

    【讨论】:

    • 您仍然可以在我的解决方案的源文件中保留" 分隔符,上面的代码只会在读入后更改它(代价是解析时间稍慢)
    • 此解决方案还允许最后一个字段丢失/不完整,并允许部分读取(即使 csv 有更多,也只能读取几列)
    【解决方案2】:

    kdb 支持建议使用此代码。 kdb+ 使用双引号来检测和忽略文件中嵌入的分隔符。所以我们可以不使用 0: 来解析 csv 文件,如下所示。

    split:"\"" vs' read0 `$":/tmp/kdb.log"; 
    headers:`$split[0];   
    tab:flip headers!"JFS*"$flip 1_split;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多