3

ここに私のファイルと関数があります:

List1.txt => ネコ イヌ トラ クマ

List2.txt => 猫 犬 虎

これらのファイルは、windows xp でエンコードされた ANSI です。

(defun get-file (filename)
  (with-open-file (stream filename)
  (loop for line = (read-line stream nil)
  while line collect line)))

(defparameter *file1* (get-file "list1.txt"))
(defparameter *file2* (get-file "list2.txt"))

(set-difference *file1* *file2*)

出力は単なる「クマ」になると思います。ただし、差分として ("cat"、"dog"、"tiger"、"bear") を返します。ファイルから情報を読み取ることが原因であると想定していますが、そこで立ち往生していました。お時間をいただきありがとうございます。

4

2 に答える 2

1

:testRainer が既に言及したキーワード パラメータとは別にset-difference、コードには別の問題があります。関数get-fileは行のリストを返します。各行は単なる 1 つの文字列です。おそらく、行を単語に分割したいと思うでしょう。関数を使用して簡単に行うことができsplit-sequenceます(Common Lispパッケージをグーグルで検索するsplit-sequenceか、

(ql:quickload :split-sequence)

もしquicklispがインストールされていれば。したがって、関数は次のようになります。たとえば、次のようになります。

(defun get-file (path)
  (with-open-file (s path)
    (let* ((len (file-length s))
           (data (make-string len)))
      (read-sequence data s)
      (mapcar #'(lambda (string) (string-trim '(#\Space #\Tab #\Newline) string))
        (split-sequence:split-sequence '#\Space data :remove-empty-subseqs t)))))


(defparameter *file1* (get-file "list1.txt"))
(defparameter *file2* (get-file "list2.txt"))

(format t "~s~%" (set-difference *file1* *file2* :test #'string-equal))

これは、正しく印刷されます:

("bear")
于 2013-04-11T15:12:07.987 に答える