2013-10-07 2 views
0

하나의 txt 파일을 Perl에서 SQL Server로 전송하려고 시도했지만 이제는 수백 개의 txt 파일을 결합한 SQL로 DB를 만들어야합니다. 이 작업을 수동으로 모든 txt 파일을 전송 저장하는 자동화 된 방법 있습니까? 하나의 txt 파일을 코딩하려고 시도합니다. 이 일을 위해 대량 삽입물을 사용해야한다고 생각하지만 어떤 코드를 사용해야하는지 확신 할 수 없습니다. 문제에 대한 조언은 정말 감사하겠습니다. 더 이상보고 싶은 코드가 있거나 구체적인 내용을 언급하는 것을 잊어 버린 경우 의견을 보내 주시면 수정하겠습니다. 고맙습니다.DBI를 사용하여 Perl에서 SQL Server로 가져올 많은 수의 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(); 

답변

2

좋아, 그래서 당신은 newregression.txt의 모든 라인

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

을 실행하고 지금은 여러 개의 파일을 위해 그것을 할 싶어. 왜 서브 루틴에 위의 코드를 포장하지, 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); 
}; 

데이터 파일의 필드 구분 기호가 주어진 경우 Bulk Insert을 사용하는 방법이 확실하지 않은 것 같습니다 (예 : 정규식 /(.*)(..)(..)/에서 필드 경계를 정의 함). FORMATFILE 옵션을 사용해야 할 수도 있습니다. 또한 DBI를 사용하여 BULK INSERT 문을 생성하는 경우 SQL Server가 실행되는 사용자는 파일 시스템 (네트워크, 로컬 또는 기타)을 통해 데이터 파일을 읽을 수 있어야합니다.

+0

그러면 각 txt 파일 이름을 입력 할 필요가 없습니까? 이 경우 300 + 파일 이름을 삽입해야합니까? 나는 이것을 할 수있는 가장 빠른 방법을 원했던가? 또한 필드 구분자를 더 이상 사용할 필요가 없으므로 더 이상 문제가되지 않습니다. 또한 로컬로 네트워크에 연결됩니다. 감사합니다 –

+0

각 입력 파일의 이름을 지정할 필요는 없습니다. glob를 사용할 수 있습니다 :'my @files = glob '* .txt'; '그러면 위와 같이 @file의 각 파일을 반복합니다. – tarmarc