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

Importing csv file into J and using them as variable

我像这样将这些数据(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 数据)中获得相同的结果?

谢谢!

我是 J 的初学者,所以您稍后可能会得到更好的答案,但仔细研究我想我找到了一些东西。

首先,tables/csv 插件文档声明 readcsv "Reads csv file into a boxed array," 强调我的,而 writecsv "Writes an array to a csv file." 换句话说,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 不知道您的值是数字;你可能需要在某处放一个 ". 来解码它们。

当你写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