从 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 中处理这个问题。我突然想到了两种方法:
使用;:
将文件内容分成"words"。这将为我产生这样的东西:
(;: file)
┌─┬───────────┬─┬─┬───────┬─┬─┬──────────┐
│A│12 17.5 3.2│ │B│7 12 11│ │C│6.2 9.3 13│
└─┴───────────┴─┴─┴───────┴─┴─┴──────────┘
这很有趣,因为它将数值组合在一起。我可以看到然后像这样选择那些列:
(0=3|i.#;:file)#;:file
我可以使用 ".
将其他行转换为数字。出于某种原因,像这样零碎地做起来感觉很老套。
使用顺序机(;:
)
关于这个动词的文档让我头晕目眩,但我想如果我画一个状态转换图我可以把这些词分解。我不知道是否可以同时将任何单词转换为数字,或者是否可以通过这种方式 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 │
└─┴───┴────┴───┘
我有一个文件,其内容如下所示:
A 12 17.5 3.2
B 7 12 11
C 6.2 9.3 13
单元格之间的白色space 可以变化并且并不重要,但必须至少有一个 space。此外,第一列只包含(或应该只包含)这三个字母中的一个,如果 0-2 可以简化 J 的生活(我怀疑它会),我很乐意使用 0-2。
我什至不确定如何在 J 中处理这个问题。我突然想到了两种方法:
使用
;:
将文件内容分成"words"。这将为我产生这样的东西:(;: file) ┌─┬───────────┬─┬─┬───────┬─┬─┬──────────┐ │A│12 17.5 3.2│ │B│7 12 11│ │C│6.2 9.3 13│ └─┴───────────┴─┴─┴───────┴─┴─┴──────────┘
这很有趣,因为它将数值组合在一起。我可以看到然后像这样选择那些列:
(0=3|i.#;:file)#;:file
我可以使用
".
将其他行转换为数字。出于某种原因,像这样零碎地做起来感觉很老套。使用顺序机(
;:
)关于这个动词的文档让我头晕目眩,但我想如果我画一个状态转换图我可以把这些词分解。我不知道是否可以同时将任何单词转换为数字,或者是否可以通过这种方式 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 │
└─┴───┴────┴───┘