【发布时间】:2013-09-29 11:07:24
【问题描述】:
在J中,读入一个文本文件后,如何摆脱那些CR或LF或CRLF,然后我可以使用".而不得到spelling error?
【问题讨论】:
标签: j
在J中,读入一个文本文件后,如何摆脱那些CR或LF或CRLF,然后我可以使用".而不得到spelling error?
【问题讨论】:
标签: j
使用freads 动词将强制行结尾为LF。如果您使用的是 J6 或更早版本,则需要先加载 files script (load 'files'),否则 freads 可作为标准库的一部分使用。然后正如 Eelvex 建议的那样,cut ;. 更具体地说,;._2 可用于使用字符串中的最后一个字符(在本例中为 LF)作为分隔符来划分文件的行:
_99&".;._2 freads 'myfile.txt'
最好使用Numbers(二元".)将文字转换为数字,而不是Do(一元".)。这避免了文件中“执行”代码的潜在安全问题,并将正确转换更多变体,比较以下:
". '45 -34' NB. monadic ".
11
_99 ". '45 -34' NB. dyadic ".
45 _34
您可能会发现以下更快:
_99 ". ];._2 freads 'myfile.txt'
Numbers 一次作用于整个数组,而不是单独作用于每一行。
【讨论】:
freads 的二元形式可以为您将文件分成几行(在封面下使用;.)。例如,'b' freads 'filename.ext' 将每一行放入自己的“盒子”(适用于不规则长度的行),'m' freads 'filename.ext' 做];._2 的事情,即制作数据的“矩阵”(这对常规数据,例如 OP 的数字表)。
/:~ (_99 ". ];._2 freads 'myfile.txt') 中那样做时,我仍然得到输出4 2 3。请告诉我为什么?
4 2 3,加减这些CR or LF or CRLF。我不能上传文件,否则会更容易
5 + _99 ". ];._2 freads 'myfile.txt' 应该返回9 7 8,因此我们已经成功解决了您的行尾问题。您现在遇到的问题与输出的形状以及排序的工作方式有关。 /:~ 将对数组中的项目进行排序。输出的形状是1 3。 IOW 你有一个二维数组(一个有 1 行/项目的表),所以 sort 正确排序了表的项目(行)。试试/:~ , _99". ];._2 freads 'myfile.txt'
cut;. 使用最后一项(品格 |2)——这应该是你的 CR/LF——同时删除此项(品格 _2)。
a =: 0 : 0 NB. a =: (1!:1)<filename
1 2 3 4
5 6 7 8
)
*: ".;._2 a
1 4 9 16
25 36 49 64
【讨论】: