Comparison 为什么可以';设置差异功能是否将列表与文件中的数据进行比较?
以下是我的文件和功能: List1.txt=>cat 狗 老虎 忍受 List2.txt=>cat 狗 老虎 这些文件是在winodws xp上进行ANSI编码的Comparison 为什么可以';设置差异功能是否将列表与文件中的数据进行比较?,comparison,format,lisp,common-lisp,set-difference,Comparison,Format,Lisp,Common Lisp,Set Difference,以下是我的文件和功能: List1.txt=>cat 狗 老虎 忍受 List2.txt=>cat 狗 老虎 这些文件是在winodws 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 "
(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*)
我认为输出将只是“熊”。但是,它返回(“猫”、“狗”、“老虎”、“熊”)作为差异。我想这是因为我从文件中读取了信息,但我被卡在那里了。谢谢你抽出时间 公共Lisp使用
EQL
作为默认测试。您希望字符串等于或类似
CL-USER > (set-difference '("cat" "dog" "tiger" "bear")
'("cat" "dog" "tiger")
:test #'string-equal)
->
("bear")
除了Rainer已经提到的
:test
关键字参数之外,代码中还有另一个问题。函数get file
返回一个行列表,其中每行仅为一个字符串。你可能想把这些行分成几个字。使用split sequence
函数(谷歌搜索split sequence
Common Lisp软件包或使用
(ql:quickload :split-sequence)
如果您已安装。因此,您的函数可能如下所示,例如:
(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")
谢谢,这很有趣。我每行只做一个单词,但这将允许我做我最初想要做的事情。没问题。实际上,您最好使用
cl-ppcre
和(split“\\s+”数据)
而不是split sequence
。谢谢,我尝试了test命令,但使用了“:test#equal”而不是“字符串相等”。非常感谢您的帮助和时间。