0

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

#!/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();
4

1 回答 1

2

好的,所以你跑

INSERT INTO RegressionTable (
  Ticker, TradeDate, HighPrice, LowPrice, TradePrice, TotalVolume, TotalValue
) 
VALUES (?, ?, ?, ?, ?, ?, ?)

对于 中的每一行newregression.txt,现在您想对多个文件执行此操作。为什么不将上面的代码包装在一个子例程中,例如insert_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);
};

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

于 2013-10-07T16:06:52.190 回答