Ocaml 当换行符为“时,如何读取文本文件的行?”/r";而不是",/n";?

Ocaml 当换行符为“时,如何读取文本文件的行?”/r";而不是",/n";?,ocaml,text-files,line-breaks,Ocaml,Text Files,Line Breaks,我有一个庞大的.txt文件,其中包含数万个形容词。在文本文件中,每个单词都在自己的行上。我通过以下功能将其读入一个列表(然后使用array.of_list)将其放入一个数组中: let read_file filename = let lines = ref [] in let chan = open_in filename in try while true; do lines := input_line chan :: !lines

我有一个庞大的.txt文件,其中包含数万个形容词。在文本文件中,每个单词都在自己的行上。我通过以下功能将其读入一个列表(然后使用
array.of_list
)将其放入一个数组中:

let read_file filename = 
    let lines = ref [] in
    let chan = open_in filename in
      try
        while true; do
      lines := input_line chan :: !lines
        done; []
      with End_of_file ->
        close_in chan;
        List.rev !lines ;;
但它不起作用,因为换行符是用
/r
表示的,而不是
/n
。最后我得到一个列表,其中有一个元素基本上是这样的:
[“abacinate\rabandon\rabase\rabash\rabate\rabbreviate\rabdicate”]


将换行符从
/r
更改为
/n
的最佳方法是什么?或者有没有一种方法可以读取文本文件,这样我就可以告诉它在到达
/r
时在列表中创建一个新元素?

好吧,您当然可以在OCaml中使用正则表达式进行某种替换。。。例如,您可以将整个文件读入字符串并进行替换。但是,如果您的文本文件没有更改(我猜在本例中不会更改,因为它只是一个大的形容词列表),我会使用文本编辑器的搜索和替换功能在文本文件本身中进行替换,而不是在OCaml程序中进行替换

如果安装了dos2unix,则可以使用它进行翻译。您也可以使用类似以下内容:

perl -pi -e 's/\r/\n/' filename

…使用这种方法意味着您只需更改一次文件,就可以使用它,而不是每次运行程序时都要在程序中进行替换,这会占用一点额外的时间。

从技术上讲,如果您的文件有
\r
-分隔记录,而不是
\n
-分隔记录,它不是由行组成的文本文件。这是一个其他格式的文件,恰好是其他平台的文本格式。显而易见的解决方案也是如此

如果您需要您的程序来处理换行符,您必须编写一个替换到
input\u line
,因为它具有内置行的固有概念(即unix上的
LF
,OSX之前的MacOS上的
CR
,DOS和Windows上的
CR-LF

由于您正在将整个文件读入内存,因此可以在
缓冲区中读取所有文件。请注意,
Buffer.add_channel
将无法工作,除非您事先知道文件大小(然后您还可以将其读入字符串)。未经测试:

let input_until_eof (chan : in_channel) : string =
  let buf = Buffer.create 10000 and tmp = String.create 4096 and n = ref 0 in
  while n := input chan tmp 0 (String.length tmp); n <> 0 do
    Buffer.add_substring buf tmp
  done;
  Buffer.contents buf
let tolerant_newline_regexp = Str.regexp "\r\\|\n\\|\013\|\010\013?"
let input_all_lines chan : string list =
  Str.split tolerant_newline_regexp (input_until_eof chan)
让输入_直到_eof(chan:in_channel):字符串=
让buf=Buffer.create 10000,tmp=String.create 4096,n=ref 0
而n:=输入chan tmp 0(String.length tmp);不做
Buffer.add_子字符串buf tmp
完成;
Buffer.contents buf
让我们来看看“\r\\\\\\\n\\\\\\013\\\\010\013?”
让我们输入所有行chan:字符串列表=
Str.split-tolerance\u newline\u regexp(输入\u直到\u eof chan)

如果要进一步解析文件内容,请使用
模块或ocamlex。

我现在意识到这是一个非常愚蠢的问题。我只是使用查找和替换。