Я работаю в R с фреймом данных, содержащим столбец с экранированными последовательностями Юникода:
d <- data.frame(id = 1, norm = "m\u0350pini\u0306\u030Ds\u0313u")
В конечном итоге мне нужно импортировать фрейм данных в MongoDB (я использую Compass), чтобы соответствующие символы Юникода отображались правильно. Я попытался сохранить его в простой текстовый файл с разделителями табуляции, но MongoDB обрабатывает столбец Юникода как строку; поэтому я попробовал сохранить его как json:
library(jsonlite)
j <- tojson(d,dataframe = "rows",pretty=T)
write(j,"jstest.json")
Однако это автоматически добавляет еще одну обратную косую черту к экранированным последовательностям, давая m\\u0350pini\\u0306\\u030Ds\\u0313u, что опять-таки MongoDB не интерпретирует как юникод.
Если я вручную вставляю в MongoDB документ с одинарной обратной косой чертой, появляются символы юникода, но для меня это очень непрактично ( тысячи документов).
Что я делаю не так?
Спасибо за помощь.
Я попробовал использовать mongoimport:
d <- data.frame(id=c(1,2),unicode=c("m\u0350pini\u030Ds\u03131u","a\u0350mpi\u030D\u03B7"))
js <- toJSON(d,dataframe = "rows",pretty = T)
write(js,"jstest.json")
mongoimport -d test -c newcoll --type json --file jtest.json --jsonArray
Однако в документах по-прежнему не отображаются символы:
{ "_id" : ObjectId("666b08603505c9daeb20edc7"), "id" : 1, "unicode" : "m\\u0350pini\\u030Ds\\u03131u" }
{ "_id" : ObjectId("666b08603505c9daeb20edc8"), "id" : 2, "unicode" : "a\\u0350mpi\\u030D\\u03B7" }
Единственный способ получить желаемый результат, который точно такой же, как и второй комментарий @Konrad Rudolph, - это вручную вставить документ с одинарными косыми чертами.
Я принципиально не могу воспроизвести вашу проблему. Я не использую Compass, но при сохранении данных в формате TSV (я использую readr, но это не имеет особого значения) и импорте через mongoimport результирующий документ в MongoDB выглядит именно так, как ожидалось ({ "_id" : { "$oid" : "666abfb67631abad9783bf8f" }, "id" : 1, "norm" : "m͐pinĭ̍s̓u" }).
Извините, я не понял, я имею в виду, что последовательности Юникода интерпретируются буквально, без преобразования в правильный символ. Я использую функцию добавления данных в Compass. Чего я не понимаю, так это почему, когда я импортирую json, строки типа m\\u0350pini\\u0306\\u030Ds\\u0313u интерпретируются буквально, но замена \\ на \ приводит к ошибке из-за «экранированных символов».
Вот еще не ясно: что вы подразумеваете под «буквальным» и «правильным характером»? Является ли результат, который я показал в моем предыдущем комментарии, тем, чего вы ожидаете? Если да, то проблема, похоже, связана с функцией импорта Compass, а не с R (и не с MongoDB). Попробуйте использовать mongoimport.
@KonradRudolph Я следовал инструкциям из вашего второго комментария и добился успеха, спасибо! Сделайте репост в качестве ответа, если позволите, я с радостью проголосую за него.





Внутри R экспортируйте данные в TSV (например, через readr):
readr::write_tsv(d, 'd.tsv')
Используйте mongoimport для импорта данных:
mongoimport --db mydb --collection mycollection --type tsv --file d.tsv --headerline
«но MongoDB рассматривает столбец Юникода как строку» — Что вы под этим подразумеваете? Конечно, это строка. В любом случае, как вы импортируете данные в MongoDB?