我正在阅读一个平面文件 - 使用我想要将它们转换成数字的字符。我写了一个将字符串转换为向量的小函数:
(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
将单位数字符转换为函数中的数字,是否有一种简单的方法可以将数字作为数字从文件中读取?
答案 0 :(得分:3)
除了Rainer的回答之外,让我提一下read-from-string
(请注意,Rainer的代码比重复应用read-from-string
更有效,因为它只会创建一个流)和parse-integer
(唉,没有parse-float
)。
请注意,如果您正在阅读CSV文件,则应该使用现成的库而不是编写自己的库。
答案 1 :(得分: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
,可以读取数字。
答案 2 :(得分:1)
请注意read
- 类函数受读者宏的影响。
选择一个例子:
* (defvar *foo* 'bar)
*FOO*
* (read-from-string "#.(setq *foo* 'baz)")
BAZ
19
* *foo*
BAZ
正如您所看到的,read-from-string
可以隐式设置变量。您可以通过将#.
设置为*read-eval*
来停用nil
阅读器宏,但无论如何,如果输入中只有整数,请考虑使用parse-integer
代替。