将 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." 换句话说,readcsv
和 writecsv
是 不是 对称操作。值的形状似乎证实了:
$ 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
我像这样将这些数据(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." 换句话说,readcsv
和 writecsv
是 不是 对称操作。值的形状似乎证实了:
$ 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