从Perl到CSV执行SQL插入的额外引号。如果我试图删除它们,就不会得到引用。我需要单引号,如;0123“;

从Perl到CSV执行SQL插入的额外引号。如果我试图删除它们,就不会得到引用。我需要单引号,如;0123“;,sql,csv,perl,Sql,Csv,Perl,当我使用SQL Insert从Perl写入csv文件时,我会得到0123或“0123”,但我需要“0123”。连接和正则表达式似乎都不能解决这个问题 这是我的密码: my $dbh = DBI->connect(qq{DBI:CSV:csv_eol=\n;csv_sep_char=\\,;}); $dbh->{'csv_tables'}->{'Table'} = {'file' => 'data.csv','col_names' => ["num","id"

当我使用SQL Insert从Perl写入csv文件时,我会得到
0123
“0123”
,但我需要
“0123”
。连接和正则表达式似乎都不能解决这个问题

这是我的密码:

my $dbh = DBI->connect(qq{DBI:CSV:csv_eol=\n;csv_sep_char=\\,;});   
$dbh->{'csv_tables'}->{'Table'} = {'file' => 'data.csv','col_names' => 
["num","id"]};
#Setup error variables
$dbh->{'RaiseError'} = 1;
$@ = '';

## Attempts to change $num
##$num = '"'.$num.'"';## this causes """0123""" 
##$num = "\"$num\"";## this causes """0123""" even if I additionally do this: 
## $num=~s/"""/"/g;
##$num = " ".$num;## causes " 0123" VERY CLOSE.  Try next line: 
##$num=~s/ //g;## This causes 0123
##$num = "".$num; ## causes 0123
##$num = "'".$num."'";## causes 123

my $value = "\'$num\',\'$id\'";
my $insert = "INSERT INTO Table VALUES ($value)";
my $sth = $dbh->prepare($insert);
$sth->execute();
$sth->finish();
$dbh->disconnect();

我希望$num的输出在CSV中最终为“0123”,但我得到的是0123或“0123”或“0123”

将变量插入SQL语句是个坏主意。您可能会受到SQL注入攻击(请参阅)。所以不要那样做

相反,使用bind参数并将额外的值传递给
execute()
方法

my $insert = 'INSERT INTO Table VALUES (?, ?)';
my $sth = $dbh->prepare($insert);
$sth->execute($num, $id);

问题是CSV条目123和“123”是相同的。一对双引号是CSV格式的一部分(至少是最常见的变体)。因此,当您尝试插入包含双引号的值时,它会将它们加倍以转义。只有当单元格包含特殊字符(如逗号、空格或转义双引号)时,DBD::CSV才会以双引号包围单元格

foo," foo ",",","""a""b"
# parses to: 'foo' -- ' foo ' -- ',' -- '"a"b'

解析器不应该关心单元格是否被引用(除非因为单元格包含这些特殊字符而需要引用)。见多亏了帕尔蒙克斯的poj(),有了一个解决方案:

这是为了方便大家:

使用占位符和“始终引用”选项

#!/usr/bin/perl
use strict;
use DBI;

my $dbh = DBI->connect("dbi:CSV:", "", "",{
   'RaiseError' => 1 }
);  

$dbh->{'csv_tables'}->{'MyTable'} = {
 'file'         => 'data1.csv',
 'col_names'    => ["num","id"],
 'always_quote' => 1,
};

my $num = '0123';
my $id  = '0124';
my $sql = "INSERT INTO MyTable VALUES (?,?)";
my $sth = $dbh->do($sql,undef,$num,$id);

poj

问题标题中的引号是双引号,而不是单引号。它们看起来也像是用Word编写的。DBD::CSV支持绑定参数,您试过了吗<代码>值(?,)然后将
$num
$id
传递给执行调用。Corssposted到choroba,谢谢!!我到帕尔蒙克斯的交叉柱有解决办法!我不得不将
'always\u quote'=>1
添加到dbh以使其工作。这是一个很好的建议,但并不能解决我最初的问题。我需要输出显示在CSV中,如下所示:
“0123”
@James:正如Grinnz在他的另一个回答中所说,听起来好像另一个应用程序出了问题。在CSV文件中,
0123
“0123”
之间没有明显的区别@James:但也许你可以通过某种方式对CSV文件进行后期处理。是的,另一个应用程序有问题,但我无法控制它。我考虑过后期处理,甚至尝试更新CSV,但遇到了问题。但是,此引用显示了分辨率。由于需要单元格的其他系统使用了该单元格,因此需要引用该单元格。