Удалить лишние экранированные двойные кавычки из списка строк Clojure

#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) и, как таковой, должен использоваться только с надежными источниками.