我有一个文件,其内容如下所示:
A 12 17.5 3.2
B 7 12 11
C 6.2 9.3 13
虽然必须至少有一个空格,但是单元格之间的空白可能会有所不同并且不重要。另外,第一列只包含(或应该只包含)这三个字母中的一个,如果它简化了J的生活(我怀疑它会),我满足于使用0-2。
我甚至不确定如何在J中接近这个。两种方法都跳出来对我说:
使用;:
将文件内容分解为"单词"。这将为我产生这样的东西:
(;: file)
┌─┬───────────┬─┬─┬───────┬─┬─┬──────────┐
│A│12 17.5 3.2│ │B│7 12 11│ │C│6.2 9.3 13│
└─┴───────────┴─┴─┴───────┴─┴─┴──────────┘
这很有趣,因为它将数值组合在一起。我可以看到然后选择那些列:
(0=3|i.#;:file)#;:file
我可以使用".
将其他行转换为数字。出于某种原因,像这样零敲碎打地感觉很乱。
使用顺序机器(;:
)
关于这个动词的文档让我头晕目眩,但我想如果我绘制了一个状态转换图,我可以将这些文字分解。我不知道是否可以同时将任何单词转换为数字,或者是否可以通过这种方式返回矩阵。是吗?
我担心我带来了太多的其他语言经验来承担这个问题,如果你知道怎么做,那么它实际上是J中的一个简单问题。是这样的吗?用J做什么是更惯用的方式?
答案 0 :(得分:3)
如果文件是一串数字,那确实会让事情变得容易一些,所以我会用A B C
替换你的1 2 3
,但我还会添加一些行来说明过滤是如何进行的完成。
file
是字符串。
[ file=.'1 12 17.5 3.2 2 7 12 11 3 6.2 9.3 13 2 2.3 3.6 12 1 3.4 2 3.4'
1 12 17.5 3.2 2 7 12 11 3 6.2 9.3 13 2 2.3 3.6 12 1 3.4 2 3.4
使用".
将文件转换为数字,然后一次使用数字4来创建使用_4 ]\
的表格,该表格使用了二元期间\
http://www.jsoftware.com/help/dictionary/d430.htm
[ array=. _4]\ ". file
1 12 17.5 3.2
2 7 12 11
3 6.2 9.3 13
2 2.3 3.6 12
1 3.4 2 3.4
完成后,您可以根据第一列对行进行分组,并执行您希望使用v/.
的任何操作,其中v
是附加到键连接的任何动词{{1} } http://www.jsoftware.com/help/dictionary/d421.htm
/.
例如,您可以获取每行条目的平均值,具体取决于第一列的类别。
({."1 </. }."1) array
+------------+----------+----------+
| 12 17.5 3.2| 7 12 11|6.2 9.3 13|
|3.4 2 3.4|2.3 3.6 12| |
+------------+----------+----------+
从下面的评论中,使用 ({."1 (+/ % #)/. }."1) array
7.7 9.75 3.3
4.65 7.8 11.5
6.2 9.3 13
技巧,您最终可以获得原始文件中您想要的形状和类型。
;:
答案 1 :(得分:2)
我认为如果可能的话,使用所有数字可能更好,因为bob建议,但是如果你需要解析包含由1个或多个空格分隔的混合类型字段的平面文件,那么下面的代码应该做得很好:
]cut;._2 freads 'myfile.txt'
┌─┬───┬────┬───┐
│A│12 │17.5│3.2│
├─┼───┼────┼───┤
│B│7 │12 │11 │
├─┼───┼────┼───┤
│C│6.2│9.3 │13 │
└─┴───┴────┴───┘