Sql server 如何使用DBI自动将大量txt文件从Perl导入SQL Server?

Sql server 如何使用DBI自动将大量txt文件从Perl导入SQL Server?,sql-server,perl,bulkinsert,dbi,Sql Server,Perl,Bulkinsert,Dbi,我曾尝试将一个txt文件从Perl传输到SQL Server,但现在我需要在SQL中创建一个DB,它将数百个txt文件组合在一起。是否有一种自动方式来保存手动传输的所有txt文件?我将插入编码一个txt文件的尝试。我相信我需要使用批量插入来实现这一点,但我不确定使用什么代码。任何关于这个问题的建议都将不胜感激,如果您希望看到更多的代码或我忘记提及的特定内容,请发表评论,我将进行编辑。多谢各位 #!/usr/bin/perl -w use strict; use DBI; use Carp;

我曾尝试将一个txt文件从Perl传输到SQL Server,但现在我需要在SQL中创建一个DB,它将数百个txt文件组合在一起。是否有一种自动方式来保存手动传输的所有txt文件?我将插入编码一个txt文件的尝试。我相信我需要使用批量插入来实现这一点,但我不确定使用什么代码。任何关于这个问题的建议都将不胜感激,如果您希望看到更多的代码或我忘记提及的特定内容,请发表评论,我将进行编辑。多谢各位

#!/usr/bin/perl -w
use strict;
use DBI;
use Carp;

    # Connect to the data source and get a handle for that connection.
my $dbh = DBI->connect('dbi:ODBC:RegressionDBS') ||
    confess "Connection Failed: $DBI::errstr";

    # This query generates a result set with one record in it.
my $sql = "SELECT 1 AS test_col";
my $tablename = "RegressionTable";

open(FH, "newregression.txt") || die "cant open file";
my $Sqlh = $dbh->prepare("INSERT INTO RegressionTable (Ticker, TradeDate, HighPrice, LowPrice, TradePrice, TotalVolume, TotalValue) VALUES (?,?,?,?,?,?,?);") || confess $DBI::errstr;
while (my $line = <FH> )
{
$line =~/^(.*)(..)(..)$/;
my ($curTicker, $wTradeDate, $wHighPrice, $wLowPrice, $wTradePrice, $wTotalVolume, $wTotalValue);
    $curTicker=$1
    #$wTradeDate=
    $wHighPrice=$2;
    $wLowPrice=$1;
    #$wTradePrice=$1;
    #$wTotalVolume=$1;
    #$wTotalValue=$4;

$Sqlh->execute($curTicker, $wTradeDate, $wHighPrice, $wLowPrice, $wTradePrice, $wTotalVolume, $wTotalValue) || confess $DBI::errstr; 
}

$Sqlh->finish();
$dbh->disconnect();
#/usr/bin/perl-w
严格使用;
使用DBI;
使用鲤鱼;
#连接到数据源并获取该连接的句柄。
my$dbh=DBI->connect('DBI:ODBC:RegressionDBS')||
坦白“连接失败:$DBI::errstr”;
#此查询生成一个包含一条记录的结果集。
my$sql=“选择1作为测试列”;
我的$tablename=“回归表”;
打开(FH,“newregression.txt”)| | die“无法打开文件”;
my$Sqlh=$dbh->prepare(“插入到回归表(股票代码、交易日期、高价、低价、交易价格、总交易量、总价值)值(?,,,,,,,,,,?,,,,,?);”)|承认$DBI::errstr;
while(我的$line=)
{
$line=~/^(.*)(..)(..)$/;
我的($curTicker、$wTradeDate、$wHighPrice、$wLowPrice、$wTradePrice、$wTotalVolume、$wTotalValue);
$curTicker=$1
#$wTradeDate=
$wHighPrice=$2;
$wLowPrice=$1;
#$wTradePrice=$1;
#$wTotalVolume=$1;
#$wTotalValue=$4;
$Sqlh->execute($curTicker、$wTradeDate、$wHighPrice、$wLowPrice、$wTradePrice、$wTotalVolume、$wTotalValue)| |坦白$DBI::errstr;
}
$Sqlh->finish();
$dbh->disconnect();
好的,那么您运行

INSERT INTO RegressionTable (
  Ticker, TradeDate, HighPrice, LowPrice, TradePrice, TotalVolume, TotalValue
) 
VALUES (?, ?, ?, ?, ?, ?, ?)
对于
newregression.txt
中的每一行,现在需要对多个文件执行此操作。为什么不将上面的代码封装在一个子例程中,比如说
insert\u file()
,然后在循环中按文件调用它

my @files = qw(red.txt green.txt blue.txt);
for my $file (@files) {
  insert_file($file);
}
或者,如果每个文件的目标表不同,请定义哈希:

my %files = (
  'red.txt'  => 'RedTable', 
  'blue.txt' => 'BlueTable'
);
while ( my ($file, $table) = each %files ) {
  insert_file($file, $table);
};

由于数据文件中的字段分隔符似乎不确定(即regex
/(*)(..)(..)/
定义字段边界),因此不确定如何使用。您可能需要使用
FORMATFILE
选项。此外,如果使用DBI生成
大容量插入
语句,请注意SQL Server运行的用户必须能够通过文件系统(网络、本地或其他)读取数据文件。

您的建议是否不要求输入每个txt文件名?在这种情况下,我需要插入300多个文件名?我希望能以最快的方式做到这一点?此外,我不需要再使用字段分隔符,因此这不再是一个问题。它还将在本地联网。谢谢,您不必为每个输入文件命名。您可以使用glob:
my@files=glob'*.txt'然后循环遍历@files中的每个文件,如上所述。