#string #clojure #hashmap #escaping #double-quotes
#строка #clojure #hashmap #экранирование #двойные кавычки
Вопрос:
У меня есть файл: matches.txt который выглядит примерно так:
"key1"
"key2"
"key3"
Когда я читаю это в память:
(with-open [r reader "matches.txt")] (doall (line-seq r)))
Я получаю следующую структуру списка, в которой заключены в кавычки строки, экранированные двойными кавычками:
(""key1""
""key2""
""key3"")
Давайте назовем этот результат ‘key-list’. Я пробовал много поисков по хэш-карте, например:
(test-hash-map (first key-list))
и ни одна из них не работает.
Я хотел бы преобразовать эти записи, чтобы я мог использовать их для извлечения записи хэш-карты.
Либо:
- Удалите экранированные двойные кавычки из структуры списка в памяти или
- Прочитайте строки из matches.txt файл без двойных двойных кавычек.
Комментарии:
1. В списке нет «экранированных двойных кавычек». Есть только кавычки, предоставленные текстовым файлом. Ваша идея № 2 — удалить эти кавычки при чтении файла — это правильный путь. Вы могли бы использовать библиотеку clojure.data.csv (которая имеет множество функций для чтения полей, разделенных запятыми, возможно, в кавычках), или вы могли бы использовать clojure.string / replace, как в Java.
Ответ №1:
Поскольку строки, заключенные в кавычки, представляют собой формат edn для строк, вы можете использовать clojure.edn/read-string для преобразования ваших строк, удалив разделители кавычек (при условии, что все ваши строки разделены кавычками):
> (with-open [rdr (clojure.java.io/reader "matches.txt")]
(doall (map clojure.edn/read-string (line-seq rdr))))
("key1" "key2" "key3")
также можно использовать clojure.core/read-string, но обратите внимание на предупреждение о том, что
… read-string может выполнять код (управляемый read-eval) и, как таковой, должен использоваться только с надежными источниками.