KDB:尝试在一个位置读取多个csv文件

She*_*har 0 kdb

我正在尝试运行以下代码以读取位置C:/ q / BitCoin / Input上所有可用的csv文件。遇到错误并且不知道解决方案是什么?csv文件是具有三个字段的标准文件。

raze{[x] 
inputdir:`:C:/q/BitCoin/Input;
filelist1:key inputdir;
filelist2:` sv' inputdir,'filelist1;
filelist3:string filelist2;
r:flip`Time`Qty`Price!("ZFF";",")0:x; 
select from r
} each `$filelist3
Run Code Online (Sandbox Code Playgroud)

硬编码文件名并在以下代码下运行可以工作,但我不想硬编码

raze {[x] 
r:flip`Time`Qty`Price!("ZFF";",")0:x; 
select from r 
} each (`$"C:/q/BitCoin/Input/bitbayPLN.csv";`$"C:/q/BitCoin/Input/anxhkAUD.csv")
Run Code Online (Sandbox Code Playgroud)

低于错误

执行查询期间发生错误。服务器发送了响应:filelist3

有人可以帮助解决问题吗?

小智 5

收到错误“ filelist3”的原因是因为filelist3是在lambda中定义的,而在lambda之外却无法识别或定义。有多种方法可以克服此问题,如下所述。

首先,您基本上可以在lambda内部进行所有已定义的工作,并将其放在每个lambda的右侧。

raze{[x] r:flip`Time`Qty`Price!("ZFF";",")0:x; select from r
  } each `$(string (` sv' `:C:/q/BitCoin/Input,'(key `:C:/q/BitCoin/Input)))
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,可以创建一个函数,该函数将为您生成filelist3,并在每个函数的右侧使用它。

f:{[inputdir] filelist1:key inputdir; filelist2:` sv' inputdir,'filelist1; filelist3:string filelist2; filelist3}

raze{[x] r:flip`Time`Qty`Price!("ZFF";",")0:x; select from r
  } each `$f[`:C:/q/BitCoin/Input]
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。

非常感谢,

乔尔

  • 真好 您也可以删除filelist3的字符串,因为它们只是再次重新转换为符号 (2认同)