我在脚本中使用循环来将行插入到数据库中,但是当客户名称包含某些字符时,它会中断。
数据
'1' 'Some+Customer Limited' 'email@somecustomerlimited.com'
期待
$a = '1'
$b = 'Some+Customer Limited'
$c = 'email@somecustomerlimited.com'
INSERT INTO t1 (c1, c2, c3, c4, c5, c6) VALUES ($a, 1, $c, $c, 0, 0);
错误
INSERT INTO t1 (c1, c2, c3, c4, c5, c6) VALUES ('1', 1, 'Some+Customer, Limited' 'email@domain.com', 0, 0)
*
ERROR at line 1:
ORA-00917: missing comma
如上所示,脚本中没有丢失的逗号,即VALUES ($a, 1, $c, $c, 0, 0);
。这是因为客户名称中的空格,还是客户名称中的+
?
答案 0 :(得分:1)
我认为问题是read
拆分空格(实际上是$ IFS中包含的任何字符),而不关心引号。
所以代替:
$a = '1'
$b = 'Some+Customer Limited'
$c = 'email@somecustomerlimited.com'
你有:
$a = "'1'"
$b = "'Some+Customer"
$c = "Limited' 'email@somecustomerlimited.com'"
据我所知,没有办法让read
'引用意识到'或者在正则表达式中拆分,你必须选择一个特殊字符来分隔CSV的字段
答案 1 :(得分:0)
正确的csv解析器可以处理非逗号分隔符,假设字段被适当引用:
ruby -rcsv -ne '
row = CSV.parse_line($_, {:col_sep => " ", :quote_char => 39.chr})
p row
' <<END
'1' 'Some+Customer Limited' 'email@somecustomerlimited.com'
END
["1", "Some+Customer Limited", "email@somecustomerlimited.com"]