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 の回答に加えて、(Rainer のコードはストリームを 1 回しか作成しないためread-from-string、繰り返し適用するよりも効率的であることに注意してください) および(残念ながら、 はありません)について言及させてください。read-from-stringparse-integerparse-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のような関数はリーダー マクロの影響を受けることに注意してください。

例を挙げてください:

* (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 に答える