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

Reading tabular data from flat file in J

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

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

单元格之间的白色space 可以变化并且并不重要,但必须至少有一个 space。此外,第一列只包含(或应该只包含)这三个字母中的一个,如果 0-2 可以简化 J 的生活(我怀疑它会),我很乐意使用 0-2。

我什至不确定如何在 J 中处理这个问题。我突然想到了两种方法:

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

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

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

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

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

  2. 使用顺序机(;:)

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

我担心我用其他语言的太多经验来解决这个问题,如果您知道如何做的话,这实际上是 J 中的一个简单问题。是这样吗?使用 J 执行此操作的更惯用的方法是什么?

如果文件是一串数字,它确实会让事情变得更容易一些,所以我会用 1 2 3 替换你的 A B C,但我也会添加几行来展示如何可以进行过滤。

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 来创建一个 table,这利用了 dyad Infix \ 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 是附加到键连词 [= 的任何动词23=]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 ".each(('123'{~ 'ABC'&i.) each @:{. , }.)"1[ _2 [\ ;: 'A 1.1 2.2 3.3 B 3.4 4.5 5.6 C 6.7 7.8 8.9'
1 1.1 2.2 3.3
2 3.4 4.5 5.6
3 6.7 7.8 8.9

我认为尽可能使用所有数字可能更可取,正如鲍勃建议的那样,但是如果您需要解析包含由 1 个或多个空格分隔的混合类型字段的平面文件,那么以下内容应该可以很好地完成工作:

   ]cut;._2 freads 'myfile.txt'
┌─┬───┬────┬───┐
│A│12 │17.5│3.2│
├─┼───┼────┼───┤
│B│7  │12  │11 │
├─┼───┼────┼───┤
│C│6.2│9.3 │13 │
└─┴───┴────┴───┘