2012-03-30 2 views
1

У меня есть CSV с тремя полями: имя, широта, долгота. Ряд выглядит следующим образом:Местоположение Mongoimport от независимых столбцов широты и долготы в CSV

Place 1,73.992964,40.739037 

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

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

Place1,[-73.992964,40.739037] 

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

ответ

2

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

для того, чтобы геопространственном индекс будет создан, информация о местоположении должна храниться в том же ключе, как описано в разделе «Некоторые примеры:» раздел в верхней части документации геопространственной Indexing: 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-файлы непосредственно в вашу коллекцию вместо этого.

+0

Большое спасибо за такой подробный экзамен.Предварительная обработка была тем, как я возглавлял, но я просто хотел удостовериться, что я не пропустил что-то в mongoimport. – Nick

1

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

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 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^