1

我正在读取一个平面文件 - 为了使用读取的字符,我想将它们转换为数字。我写了一个将字符串转换为向量的小函数:

(defun string-to-vec (strng)
  (setf strng (remove #\Space strng)) 
    (let ((vec (make-array (length strng))))
      (dotimes (i (length strng) vec)
        (setf (svref vec i) (char strng i)))))

但是,这会返回一个带有字符条目的向量。缺少char-code用于将单位编号字符转换为函数中的数字,是否有一种简单的方法可以从文件中将数字读取为数字?

4

3 回答 3

3

除了 Rainer 的回答,让我提一下read-from-string(请注意,Rainer 的代码比重复应用更有效,read-from-string因为它只创建一次流)和parse-integer(唉,没有parse-float)。

请注意,如果您正在阅读 CSV 文件,您可能应该使用现成的库而不是编写自己的库。

于 2012-11-14T15:37:21.653 回答
2

上图更短:

? (map 'vector #'identity (remove #\Space "123"))
#(#\1 #\2 #\3)

您可以转换字符串:

(defun string-to-vector-of-numbers (string)
  (coerce 
   (with-input-from-string (s string)
     (loop with end = '#:end
           for n = (read s nil end)
           until (eql n end)
           unless (numberp n) do (error "Input ~a is not a number." n)
           collect n))
   'vector))

但是直接从文件中读取数字会更容易。使用READ,它可以读取数字。

于 2012-11-14T14:10:46.577 回答
1

请注意,read-like 函数受阅读器宏的影响。

举个例子:

* (defvar *foo* 'bar)

*FOO*
* (read-from-string "#.(setq *foo* 'baz)")

BAZ
19
* *foo*

BAZ

如您所见read-from-string,可以隐式设置一个变量。您可以通过设置为禁用#.阅读器宏,但无论如何,如果输入中只有整数,则考虑改用。*read-eval*nilparse-integer

于 2012-11-14T22:56:16.083 回答