Дополнительные кавычки делают вставку SQL из Perl в CSV. Если я пытаюсь удалить их, я не получаю кавычки. Мне нужны одинарные кавычки, как в "0123" - PullRequest
0 голосов
/ 10 октября 2019

Когда я пишу в CSV-файл из Perl, используя SQL Insert, я получаю либо 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 "

Ответы [ 3 ]

4 голосов
/ 10 октября 2019

Благодаря poj в PerlMonks (https://www.perlmonks.org/?node_id=11107315), есть решение:

Вот это для удобства каждого:

Использование заполнителей и опция Always_quote

#!/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

3 голосов
/ 10 октября 2019

Вставка переменных в операторы SQL - плохая идея. Вы оставляете себя открытым для атак SQL-инъекций (см. Таблицы Бобби ). Так что не делайте этого.

Вместо этого используйте параметры связывания и передавайте дополнительные значения методу execute().

my $insert = 'INSERT INTO Table VALUES (?, ?)';
my $sth = $dbh->prepare($insert);
$sth->execute($num, $id);
1 голос
/ 10 октября 2019

Проблема в том, что CSV-запись 123 и «123» идентичны. Одна пара двойных кавычек является частью формата CSV (по крайней мере, самый распространенный вариант). Поэтому, когда вы пытаетесь вставить значение, содержащее двойные кавычки, он удваивает их, чтобы избежать их. DBD :: CSV окружает ячейку в двойных кавычках, только если она содержит специальные символы, такие как запятая, пробел или экранированные двойные кавычки.

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

Парсеру не должно быть важно, указана ли ячейка в кавычках или нет (если это не нужно, потому что ячейка содержит эти специальные символы). Смотри http://tburette.github.io/blog/2014/05/25/so-you-want-to-write-your-own-CSV-code/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...