将csv文件导入J并将其用作变量

时间:2017-11-14 19:36:53

标签: j

我将这些数据(20个向量v)保存到csv文件中,就像这样

v=:<"1 (? 20 2 $ 20)
makecsv v
v writecsv jpath'~temp/position.csv'
]vcsv =: freads jpath '~temp/position.csv'
fixcsv vcsv

,我可以通过

导入csv文件
readcsv jpath '~temp/position.csv'

但是,如果我将其命名为

,则不会给出相同的结果
w=: readcsv jpath '~temp/position.csv'
diff=: ([{]) ,. ]

0 diff v
0 diff w

实际上,0 diff w给出了长度误差

我是否应该使用其他方法从v(原始)和w(导入的csv数据)获得相同的结果?

谢谢!

2 个答案:

答案 0 :(得分:2)

我是初学者,所以你以后可能会得到一个更好的答案,但是我觉得我找到了一些东西。

首先,tables/csv插件文档说明readcsv&#34;将csv文件读入盒装数组,&#34;强调我的,writecsv&#34;将数组写入csv文件。&#34;换句话说,readcsvwritecsv对称操作。值的形状似乎证实了:

   $ w
1 20
   $ v
20

这也是diff适用于v但不适用w的原因。如果您只是取消打包结果,它似乎更好用:

0 diff 0 { w
┌───┬─────┐
│1 3│1 3  │
├───┼─────┤
 ...
├───┼─────┤
│1 3│5 8  │
└───┴─────┘

但是,的形状仍然不完全相同:

   $ > v
20 2
   $ > 0 { w
20 5

我认为这是因为readcsv并不知道您的值是数字的;你可能需要在那里扔一个".来解码它们。

答案 1 :(得分:1)

当您编写CSV文件时,您只有一堆ASCII字符。在这种情况下,您可以获得数字,空格和逗号。

当您阅读CSV时,J无法保证格式或内容。 fixcsv将您的逗号和换行符转换为单元格网格,但J将其全部设置为安全,因为它是一堆可变长度的ASCII字符串。

如果您想回到v,您需要做两件事。首先是使尺寸正确。根据定义,CSV文件是二维的。如果您更改示例以将二维数组写入CSV,则会在fixcsv readcsv之后发现您具有相同的形状。

u =: 4 5 $ v
   u writecsv jpath'~temp/position.csv'
104
   ] t =: fixcsv freads jpath '~temp/position.csv'
┌────┬─────┬────┬────┬─────┐
│9 11│1 4  │8 3 │3 12│5 4  │
├────┼─────┼────┼────┼─────┤
│7 11│10 11│9 10│0 8 │6 16 │
├────┼─────┼────┼────┼─────┤
│13 8│17 12│13 2│5 19│17 14│
├────┼─────┼────┼────┼─────┤
│2 15│19 10│3 1 │12 7│14 13│
└────┴─────┴────┴────┴─────┘
   $ v
20
   $ u
4 5
   $ t
4 5

如果你肯定在处理一维列表(尽管是盒装数字对),那么你可以Ravel (,)阅读你所读到的内容以便将其缩小到一个维度。

   $ w
1 20
   $ , w
20

一旦你有相同的形状,你需要将ASCII文本转换为数字数组。使用Numbers (".)执行此操作。

   10 * > {. v
90 110
   10 * > {. , w
|domain error
|   10    *>{.,w
   'a' , > {. , w
a9 11
   10 * _ ". > {. , w
90 110