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')字符串替换文件
    @用于单字符替换的DanielLyons
    charsub
    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 │
    └─┴───┴────┴───┘