`字段不能相同:''和''`mongoimport错误

时间:2015-04-14 20:49:26

标签: mongodb csv mongoimport

我试图在本地计算机上将csv导入mongodb。我在shell中使用了以下命令:

mongoimport -d mydb -c things --type csv --file /Users/..../agentsFullOutput.csv --headerline

我收到以下错误:

Failed: fields cannot be identical: '' and ''

我找不到任何关于这意味着什么的东西。我究竟做错了什么?顺便说一下,csv文件是mongoexport的结果。

这里是列标题和一些数据:

_id build_profile   company_address company_name    company_website created_at  device _token   downloaded_app  email   first_name  last_name   is_proapp   modified_at mobile_phone    terms_accepted_at   license_number  broker_id   join_unique_url linkedin_profile_id billing_customer_id billing_zip mobile_phone    office_phone    vendors_count   clients_count   app_client
ObjectID(52ab245b763f4aec448b6763)  0   California  Lateral test    2014-01-01T08:19:05.470Z            test    test    test        2015-04-18T05:16:37.155Z    (123) 123-1234                          zip (123) 123-1234      10  5   
ObjectID(52b46bfc763f4ad9198b45ab)      7928    test    test    2014-01-01T08:19:05.470Z                Jennifer    Chase       2015-04-15T17:05:17.114Z            5551112     jennifer-chase      test    7071            22  64  

12 个答案:

答案 0 :(得分:19)

我有完全相同的问题。我在Excel中打开一个CSV文件来按摩它并再次将其保存。在尝试使用“mongoimport”命令将其导入Mongo时,我得到了相同的错误消息,我有相同的值。我一遍又一遍地检查了列标题,以确保没有任何相同的值。

我最终尝试使用“格式”下拉菜单中的“Windows逗号分隔(.csv)”选项而不是“通用格式”中的默认“逗号分隔值(.csv)”从Excel重新保存文件部分。

工作得很好。

答案 1 :(得分:2)

错误: Mongo-tools正在检查标题行中的字段是否唯一。 这是因为MongoDB不支持文档中的重复字段名称。

来自mongo-tools repo

  // NOTE: this means we will not support imports that have fields like
  // a, a - since this is invalid in MongoDB
  if field == latterField {
    return fmt.Errorf("fields cannot be identical: '%v' and '%v'", field, latterField)
  }

修改

我能够通过在标题行中创建具有重复字段名称的csv文件来重现此错误消息。 您的csv文件似乎在标题行''''中有重复的字段名称。如果没有看到我想象的实际文件,标题行中会出现field1,field2,,field3,,field4

答案 2 :(得分:1)

我有类似的问题。我创建了一个Excel电子表格,在一列中我有一个线性化的XML字符串。似乎Excel的保存功能没有很好地处理其中一个XML字符串,并从中创建了其他字段(列)。当然我没有任何列标题用于那些额外的列,所以当我尝试导入到MongoDB时,我遇到了这个错误。

我能够通过找到问题子XML字符串来纠正它。事实证明,有些空间实际上是标签,Excel使用标签将字符串分隔成多个单元格。用一个空格替换选项卡后,CSV保存正确,mongoimport正常工作。

答案 3 :(得分:1)

使用mongoimport时出现相同的错误 mongoimport --db test --collection transactions --type csv --headerline --file ~/test.csv

我得到的错误是 Failed: fields cannot be identical: '100' and '100'

我使用mongoexport导出了一个csv。 然后在Mac上使用Microsoft Excel进行了一些更改并尝试了mongoimport,这导致了错误。我认为MS Excel保存为csv会发生意外更改,使文件无法用于mongoimport。

然后,我使用mongoexport再次导出文件,现在使用Sublime编辑器进行了我需要的更改。 mongoimport现在没有问题。

答案 4 :(得分:1)

我正在关注Adhil Maujahid的博客文章" Interactive Data Visualization with D3.js, DC.js, Python, and MongoDB "我遇到过这个问题。花了近一个小时后,我将命令 - 标题 更改为 -f 1,2,3,.... 44 (一直到#34; 44 ")。这里44是文件中的属性数。因此,如果您遇到过这个问题,请尝试解决此问题。如果你知道根本原因,请让我知道这背后的逻辑。

答案 5 :(得分:1)

找到解决方案here - 我在记事本++中打开文件并用LF(\ n)替换了我的所有CR(\ r)。找到了替换 - 我再次导入了它,并且它有效!

enter image description here

答案 6 :(得分:0)

通常这是因为您的文件没有“\ n”(换行符),只有“\ r”(回车)。如果您从“Mac”而不是最新的* nix或Windows创建文件,通常会发生这种情况。

*因此,当MongoDB尝试读取CSV时,它会将整个文件作为单行读取并抛出错误。 See this bug report *

<强>解决方案:

Windows –> NIX: 
tr -d '\r' < windowsfile > nixfile // delete the carriage returns

Mac –> NIX: 
tr '\r' '\n' < macfile > nixfile // translate carriage returns into newlines

NIX –> Mac: 
tr '\n' '\r' < macfile > nixfile // translate newlines into carriage returns

Yet another option is to do this from within vi like so:

:set fileformat = unix 
:w

信用:https://danielmiessler.com/study/crlf/#gs.bJ39VzA

还有其他一些CLI工具,如dos2Unix和unix2dos等等,这将有助于如下:

awk '{ sub("\r$", ""); print }' dos.txt > unix.txt


perl -pe 's/\r$//' < dos.txt > unix.txt

有时,您的CSV文件可能根本没有标题!

HTH

答案 7 :(得分:0)

同样的问题,结果是该文件包含无列标题的一些数据。

enter image description here

答案 8 :(得分:0)

将CSV文件保存为Windows逗号分隔(.csv)文件。 步骤:

  
      
  1. 打开CSV或Excel文件。
  2.   
  3. 另存为选项
  4.   
  5. 选择Formate(Windows逗号分隔(.csv))
  6.   
Run Command: ./mongoimport --db betahrprocesses --collection employee --type csv --headerline  --file employee.csv 

enter image description here

答案 9 :(得分:0)

我发现在CSV文件中将CR替换为CR + LF或将CR替换为LF可以解决在Windows和mongodb 4.0.12中运行mongoimport的问题。

答案 10 :(得分:0)

就我而言,我只是打开了 CSV 文件,标记了第一个空列并拖动以收集更多空列,然后按删除然后保存。那摆脱了这个问题。就我而言,这些列没有任何数据,因此删除这两个虚拟列是安全的。

答案 11 :(得分:-2)

在csv格式中,每个字段必须用逗号分隔。在示例中是选项卡还是空格?。

你会尝试使用这样的文件:

_id,build_profile,company_address,company_name,company_website,created_at,device,_token,downloaded_app,email,first_name,last_name,is_proapp,modified_at,mobile_phone,terms_accepted_at,license_number,broker_id,join_unique_url,linkedin_profile_id,billing_customer_id,billing_zip,mobile_phone,office_phone,vendors_count,clients_count,app_client
ObjectID(52ab245b763f4aec448b6763),0,California,Lateral,test,2014-01-01T08:19:05.470Z,,test,test,test,2015-04-18T05:16:37.155Z,(123),123-1234,,,,zip,(123),123-1234,10,5,
ObjectID(52b46bfc763f4ad9198b45ab),7928,test,test,2014-01-01T08:19:05.470Z,,Jennifer,Chase,2015-04-15T17:05:17.114Z,,5551112,jennifer-chase,test,7071,,22,64,