Parsing 在J中从平面文件读取表格数据
我有一个文件,其内容如下:Parsing 在J中从平面文件读取表格数据,parsing,j,Parsing,J,我有一个文件,其内容如下: A 12 17.5 3.2 B 7 12 11 C 6.2 9.3 13 单元格之间的空白可能会有所不同,并且不显著,但必须至少有一个空格。此外,第一列只包含(或应该只包含)这三个字母中的一个,如果0-2简化了J的使用(我怀疑它会),我愿意使用0-2 我甚至不知道如何在J中实现这一点。有两种方法突然向我袭来: 使用;:将文件内容分解为“字”。这将为我产生类似的结果: (;: file) ┌─┬───────────┬─┬─
A 12 17.5 3.2
B 7 12 11
C 6.2 9.3 13
单元格之间的空白可能会有所不同,并且不显著,但必须至少有一个空格。此外,第一列只包含(或应该只包含)这三个字母中的一个,如果0-2简化了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做这件事的更惯用的方法是什么?如果文件是一个数字串,它确实让事情变得更容易,所以我将用
abc
de>1 2 3,但我还将添加几行来说明如何进行过滤
文件
是字符串
[ 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个数字,使用\u 4]\
创建一个表,该表利用了二元中缀\
完成后,您可以根据行的第一列对行进行分组,并使用v/
执行任何操作,其中v
是附加到键连词/的任何动词。
从下面的注释中,使用;:代码>技巧您可以从原始文件中获得所需的形状和类型
;"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
我认为,如bob所建议的,如果可能,最好使用所有数字,但是如果您需要解析包含由1个或多个空格分隔的混合类型字段的平面文件,那么以下内容应该可以很好地完成这项工作:
]cut;._2 freads 'myfile.txt'
┌─┬───┬────┬───┐
│A│12 │17.5│3.2│
├─┼───┼────┼───┤
│B│7 │12 │11 │
├─┼───┼────┼───┤
│C│6.2│9.3 │13 │
└─┴───┴────┴───┘
您可以将数字部分分组到一个矩阵中,并使用({.&>;>.}.&>)将行标签分开cutLF
.IMO,解析并不是J更强大的方面之一,最好使用您更熟悉的其他工具进行解析,以便可以直接在J中对其进行计算。我在第一列中有固定数量的值,因此在此之前,我当然可以替换a=1、B=2等。感谢您提供的详细答案在这一点上,我似乎也把自己弄糊涂了。你能提供的任何信息都将不胜感激,或者我可以提出一个单独的问题。我想这可能是我想要的。((CR,LF,'TCV'),'123')字符串替换文件
@用于单字符替换的DanielLyonscharsub
比stringreplace
更快、更精简、更简单'A1B2C3'charsub文件
谢谢,这对我以后会很有用!
({."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
]cut;._2 freads 'myfile.txt'
┌─┬───┬────┬───┐
│A│12 │17.5│3.2│
├─┼───┼────┼───┤
│B│7 │12 │11 │
├─┼───┼────┼───┤
│C│6.2│9.3 │13 │
└─┴───┴────┴───┘