Монгоимпорт местоположения из независимых столбцов широты и долготы в CSV - PullRequest
2 голосов
/ 30 марта 2012

У меня есть CSV с 3 полями: имя, широта, долгота.Строка выглядит следующим образом:

Place 1,73.992964,40.739037

Как правильно ввести широту и долготу моноимпорта в поле loc?Я понимаю, что индексированные поля местоположения должны быть долготой, широтой и представляют собой один массив вместо двух дискретных полей для широты и долготы, но мне не хватает, если есть способ обработать переход от дискретных значений к массиву через mongoimport

Нужно ли сначала преобразовывать в CSV с одним столбцом loc с долготой и широтой в нем?

Place1,[-73.992964,40.739037]

Я часто буду иметь дело с CSV, в которых хранятся широта и долготав независимых столбцах, поэтому я надеюсь найти способ сделать это с помощью mongoimport.

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Mongoimport имеет очень ограниченные возможности, и в таких ситуациях официальная рекомендация - написать собственный скрипт, который построчно анализирует ваш CSV-файл и создает документы именно так, как вы хотели бы, чтобы они отображались.

Для создания геопространственного индекса информация о местоположении должна храниться под тем же ключом, как описано в разделе «Некоторые примеры:» в верхней части документации по геопространственной индексации: http://www.mongodb.org/display/DOCS/Geospatial+Indexing

При импорте данных непосредственно из файла .csv создаются документы, подобные этому:

doc1.csv:
place, lat, lon
Place 1,73.992964,40.739037

$ ./mongoimport -d test -c a --type csv --headerline --file doc1.csv 

> db.a.find()
{ "_id" : ObjectId("4f7602d70c873ff911798fd3"), "place" : "Place 1", "lat" : 73.992964, "lon" : 40.739037 }

К сожалению, невозможно создать геопространственный индекс для документа выше.

В качестве эксперимента я безуспешно пытался импортировать файл .csv с данными во втором формате, который вы описали.

doc2.csv:
place, loc
Place1,[-73.992964,40.739037]

$ ./mongoimport -d test -c b --type csv --headerline --file doc2.csv 

> db.b.find()
{ "_id" : ObjectId("4f7602e40c873ff911798fd4"), "place" : "Place1", "loc" : "[-73.992964", "field2" : "40.739037]" }

В качестве дальнейшего эксперимента я изменил документ .csv в формат json и импортировал его, и, похоже, это сработало.

doc3.json:
{name:"Place1" , loc:[-73.992964,40.739037]}

$ ./mongoimport -d test -c c --type json --file doc3.json 

> db.c.find()
{ "_id" : ObjectId("4f7604570c873ff911798fd5"), "name" : "Place1", "loc" : [ -73.992964, 40.739037 ] }

Однако, если вы пишете сценарий для преобразования всех ваших файлов .csv в формат .json, вам, вероятно, лучше написать собственный сценарий для импорта файлов .csv прямо в вашу коллекцию.,

1 голос
/ 15 июля 2013

У меня возникла похожая проблема, и я решил ее, выполнив короткий этап предварительной обработки, используя sed для преобразования CSV в подходящий формат JSON (также используя новые объекты GeoJSON ):

sed 's/\([^,]*\),\([0-9.-]*\),\([0-9.-]*\)/{ place: \1, location:{ type: "Point", coordinates: [ \3, \2 ] } }/' <data.csv >data.json

Объяснение того, что происходит:

sed          // Execute the sed command
's/          // Use substitute mode

\([^,]*\)    // Match a string containing anything except a ',' [1]
,            // Match a single ',' (the separator)
\([0-9.-]*\) // Match any combination of numbers, '.' or '-' [2]
,            // Match a single ',' (the separator)
\([0-9.-]*\) // Match any combination of numbers, '.' or '-' [3]

/{ place: \1, location:{ type: "Point", coordinates: [ \3, \2 ] } }/'
// Replace the match with the appropriate JSON format, inserting
// parts of the matched pattern ([1],[2],[3])

<data.csv    // Perform the command on the contents of the data.csv file
>data.json   // Output the results to a data.json file

Я обнаружил, что sed довольно эффективен, и даже с CSV-файлом, содержащим ~ 8 миллионов строк, выполнение этой операции заняло всего около минуты.это преобразование.

Это простая задача импортировать вновь созданный файл JSON с использованием mongoimport, как показано в ответе Марка.

...