我将这些数据(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数据)获得相同的结果?
谢谢!
答案 0 :(得分:2)
我是初学者,所以你以后可能会得到一个更好的答案,但是我觉得我找到了一些东西。
首先,tables/csv
插件文档说明readcsv
&#34;将csv文件读入盒装数组,&#34;强调我的,writecsv
&#34;将数组写入csv文件。&#34;换句话说,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
并不知道您的值是数字的;你可能需要在那里扔一个".
来解码它们。
答案 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