从J中的平面文件中读取表格数据

时间:2017-10-26 22:37:16

标签: parsing j

我有一个文件,其内容如下所示:

A  12    17.5   3.2
B   7    12    11
C   6.2   9.3  13

虽然必须至少有一个空格,但是单元格之间的空白可能会有所不同并且不重要。另外,第一列只包含(或应该只包含)这三个字母中的一个,如果它简化了J的生活(我怀疑它会),我满足于使用0-2。

我甚至不确定如何在J中接近这个。两种方法都跳出来对我说:

  1. 使用;:将文件内容分解为"单词"。这将为我产生这样的东西:

       (;: file)
    ┌─┬───────────┬─┬─┬───────┬─┬─┬──────────┐
    │A│12 17.5 3.2│ │B│7 12 11│ │C│6.2 9.3 13│
    └─┴───────────┴─┴─┴───────┴─┴─┴──────────┘
    

    这很有趣,因为它将数值组合在一起。我可以看到然后选择那些列:

    (0=3|i.#;:file)#;:file
    

    我可以使用".将其他行转换为数字。出于某种原因,像这样零敲碎打地感觉很乱。

  2. 使用顺序机器(;:

    关于这个动词的文档让我头晕目眩,但我想如果我绘制了一个状态转换图,我可以将这些文字分解。我不知道是否可以同时将任何单词转换为数字,或者是否可以通过这种方式返回矩阵。是吗?

  3. 我担心我带来了太多的其他语言经验来承担这个问题,如果你知道怎么做,那么它实际上是J中的一个简单问题。是这样的吗?用J做什么是更惯用的方式?

2 个答案:

答案 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 │
└─┴───┴────┴───┘