我正在使用 Dyalog 的 ⎕nget
的“行数组”模式读取文件:
lines _ _ ← ⎕nget '/usr/share/dict/words' 1
它似乎有效:
lines[1]
10th
但是单个元素似乎不是字符数组:
line ← lines[1]
line
10th
≢ line
1
⍴ line
这里我们看到第一行的计数为 1,形状为空数组。我无法进一步索引它; lines[1][1]
或 line[1]
是 RANK ERROR。如果我在 RHS 上使用 ⊂,我可以一次将值分配给多个变量,并为每个变量获得相同的行为。但是,如果我在不左鞋的情况下进行多项作业,我会得到:
word rest ← line
word
10th
≢ word
4
⍴ word
4
终于得到了我所期望的字符数组!然而,它并没有明显地与 line
中隐藏的任何其他内容分开;另一个变量是相同的:
rest
10th
≢ rest
4
⍴ rest
4
word ≡ rest
1
值得注意的是,当我查看 word
时,它没有前导空格,这与 line
不同。所以看起来 ⎕nget
返回的内容矩阵中的各个数组元素被进一步包裹在一些没有显示形状或计数的东西中,并且无法被索引,但是当我使用解构赋值来解包它们。这感觉很像 Common Lisp 中的多值东西。
如果有人能解释这里发生了什么,我将不胜感激。我觉得我缺少一些非常基本的东西。
最佳答案
使用“行数组”模式读取文件的结果是一个嵌套数组。它特别是一个字符向量的嵌套向量,其中每个字符向量都是文本文件中的一行。
例如这里取\tmp\test.txt
:
my text file
has 3
lines
如果我们读入这个,我们可以检查内容
(content newline encoding) ← ⎕nget'\tmp\test.txt' 1
≢ content ⍝ How many lines?
3
≢¨content ⍝ How long is each line?
12 5 5
content[2] ⍝ Indexing returns a scalar (non-simple)
┌─────┐
│has 3│
└─────┘
2⊃content ⍝ Use pick to get the contents of the 2nd scalar
has 3
⊃content[2] ⍝ Disclose the non-simple scalar
has 3
正如你可能read from the online documentation ,⎕NGET
的默认行为是引入一个带有嵌入换行符的简单(非嵌套)字符向量。这些通常取决于操作系统。
(content encoding newline) ← ⎕nget'\tmp\test.txt'
newline ⍝ Unicode code points for line endings in this file (Microsoft Windows)
13 10
content
my text file
has 3
lines
content ∊ ⎕ucs 10 13
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
但是使用“行数组”模式,您会得到一个嵌套结果。
有关嵌套数组和数组模型的快速介绍,请参阅 Stefan Kruger's LearnAPL book .
https://stackoverflow.com/questions/69945679/
相关文章:
python - 如何根据字典键和值过滤 Pandas 数据框行?
r - 如何编写一个 apply() 函数来将矩阵列中的每个元素限制为最大允许值?
typescript - @typescript-eslint/naming-convention
javascript - 如何使用 "onclick"方法获取数据属性?
intellij-idea - 如何将项目从 IDEA 连接到 Gitlab
flutter - 无法将类型为 'String' 的值分配给 flutter Getx 中类型为