插入排序 - MongoDB如何正確插入雙引號的文字記錄? ?
迷茫
迷茫 2017-04-24 09:13:20
0
1
904

使用自帶的mongoimport.exe導入test.csv檔(測試內容如下):

name,pass
test1,ztj"ile0
test2,"audreyhepburn"
test3,Xiaoya”””oge521
test4,""520xiangbin

問題:
導入後使用find({name:/^test/})查詢,發現pass欄位全部顯示錯誤(和csv中原值完全不同,顯示為空值或只有一半文字等)-請問MongoDB如何正確插入帶雙引號的文字記錄? ?

無論是逐條insert或批量import都無法插入雙引號的記錄,即使使用「」轉義也不行,求大神!

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(1)
PHPzhong

根據 CSV 的標準:

   file = [header CRLF] record *(CRLF record) [CRLF]
   header = name *(COMMA name)
   record = field *(COMMA field)
   name = field
   field = (escaped / non-escaped)
   escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE
   non-escaped = *TEXTDATA
   COMMA = %x2C
   CR = %x0D
   DQUOTE =  %x22
   LF = %x0A
   CRLF = CR LF
   TEXTDATA =  %x20-21 / %x23-2B / %x2D-7E

你舉的例子中,test1test4 都是不合法的,雖然我沒有確認 MongoDB 是嚴格按照 RFC 4180 的標準來解析 CSV 的,但你的文件格式肯定是有很大問題。

因此還是建議先用工具把你的 CSV 檔案標準化之後再導入資料庫,不知道你的資料量有多大,但這只是簡單的文字處理,耗時應該是可以接受的。

下面是一個方案,雖然不完美,但應該適用大多情況:

# 除了首行之外,对于每一行:
for line in file[1 ...]
  # 将第一个逗号前的部分作为 name, 逗号后的作为 pass
  [1:name, 2:pass] = line.match /^([^,])+,(.*)/

  # 如果存在 name 和 pass
  if name and pass
    # 如果在忽略首尾空格的情况下 pass 不是以双引号开头和结尾的,或者 pass 中间存在单个双引号就进行重新转义
    unless pass.trim().match(/^".*"$/) and !pass.match(/[^"]"[^"]/)
      # 重复双引号
      pass = pass.replace /"/, '""'
      # 在前后加上双引号
      pass = '"' + pass + '"'

    console.log [name, pass].join ','

https://tools.ietf.org/html/rfc4180

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板