插入排序 - MongoDB如何正确插入带双引号的文本记录??
迷茫
迷茫 2017-04-24 09:13:20
0
1
911

使用自带的mongoimport.exe导入test.csv文件(测试内容如下):

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

问题:
导入后使用find({name:/^test/})查询,发现pass字段全部显示错误(和csv中原值完全不同,显示为空值或者只有一半文本等)——请问MongoDB如何正确插入带双引号的文本记录??

无论是逐条insert还是批量import都无法插入带双引号的记录,即使使用“\”转义也不行,求大神!

迷茫
迷茫

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

membalas semua(1)
PHPzhong

Mengikut piawaian 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

Dalam contoh yang anda berikan, kedua-dua test1 dan test4 adalah menyalahi undang-undang Walaupun saya tidak mengesahkan bahawa MongoDB menghuraikan CSV mengikut piawaian RFC 4180, mesti ada masalah besar dengan format fail anda.

Oleh itu, adalah disyorkan untuk menggunakan alat untuk menyeragamkan fail CSV anda sebelum mengimportnya ke dalam pangkalan data Saya tidak tahu berapa besar volum data anda, tetapi ini hanyalah pemprosesan teks yang mudah, dan penggunaan masa sepatutnya boleh diterima.

Berikut ialah penyelesaian Walaupun ia tidak sempurna, ia sepatutnya sesuai untuk kebanyakan situasi:

# 除了首行之外,对于每一行:
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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan