मैं एक Linux सर्वर से MS SQL Server 2008 (कनेक्शन स्ट्रिंग) से कनेक्ट करने के लिए ODBC और FreeTDS का उपयोग कर रहा हूं। मुझे SQL सर्वर पर तालिका में RHEL- सर्वर पर एक स्थानीय .CSV फ़ाइल की सामग्री प्राप्त करने की आवश्यकता है। हालाँकि मेरी SQL कम से कम कहने के लिए थोड़ा जर्जर है। मुझे कैसे आगे बढ़ना चाहिए? मैं डीबीआई का भी अजनबी हूं।

#!/usr/bin/perl

# PERL MODULES WE WILL BE USING
use DBI;
use DBD::ODBC;

my $data_source = q/dbi:ODBC:MSSQLServer/; # DSN string from /etc/odbc.ini
my $user = q/Username/;
my $password = q/Password/;
my $dbh = DBI->connect($data_source, $user, $password, {RaiseError => 0, PrintError => 1}) or die "Can't connect to $data_source: $DBI::errstr";

.Csv फ़ाइल में प्रत्येक पंक्ति पर अल्पविराम द्वारा अलग किए गए 2 मान हैं। हर पंक्ति को तालिका में सम्मिलित किया जाना चाहिए। डेटाबेस की तालिका में 2 कॉलम (attribute1 और attribute2) हैं।

.csv सामग्री उदाहरण:

server1, id1

server2, id2

server3, id1

server4, id9

प्राथमिक कुंजी संख्या मान पहले से सेट है, इसलिए मुझे नहीं लगता कि डुप्लिकेट मान एक समस्या है।

-5
HDemaiter 3 पद 2015, 19:04

3 जवाब

सबसे बढ़िया उत्तर

माफ करना मुझे एहसास नहीं हो रहा था कि मैंने थोड़ा बहुत पूछा। मैं वास्तव में इसे अपने दम पर समझ गया। इसलिए मुझे लगता है कि अगर किसी को इसकी जरूरत है तो मैं यहां कोड छोड़ दूंगा। आपका दिन शुभ हो!

#!/usr/bin/perl

# PERL MODULES
use strict;
use DBI;
use DBD::ODBC;
use Text::CSV;
use List::MoreUtils qw(each_array);

# SOME VARIABLES
my $file = '/tmp/Stevo/clientlist.csv';
my $csv = ();
my $fh = ();
my $data_source = q/dbi:ODBC:MSSQLServer/;
my $user = q/username/;
my $password = q/password/;

# WRITE HOSTNAMES FROM CSV TO ARRAY
my @hostnames;
open (my $csv, '<', $file) || die "cant open";
foreach (<$csv>) {
   chomp;
   my @fields = split(/\,/);
   push @hostnames, $fields[0];
}
# WRITE CLIENTVERSIONS FROM CVS ARRAY
my @clientversions;
open (my $csv, '<', $file) || die "cant open";
foreach (<$csv>) {
   chomp;
   my @fields = split(/\,/);
   push @clientversions, $fields[1];
}
# CONNECTION STRING
my $dbh = DBI->connect($data_source, $user, $password, {RaiseError => 0, PrintError => 1}) or die "Can't connect to $data_source: $DBI::errstr";

# INSERTION CODE
my $sth_insert = $dbh->prepare('INSERT INTO dbo.LegatoClients (ClientName, ClientVersion) VALUES (?, ?)')
  or die $dbh->errstr;
   # EVERYTIME $EA IS CALLED THE NEXT LINE OF THE ARRAYS WILL BE RETURNED 
my $ea = each_array(@hostnames, @clientversions);
   # SET VALUES USING THE EVERYTIME ARRAY
while ( my ($val_hostnames, $val_clientversions) = $ea->() ) {
  $sth_insert->execute($val_hostnames, $val_clientversions) or die $dbh->errstr;
}
0
HDemaiter 4 पद 2015, 13:26

आपके परीक्षण में शामिल हैं:

Server1, id1

Server2, id2

Server3, id1

Server4, id9

==============================

बल्क डालने के लिए नीचे दिए गए कोड का उपयोग करें।

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

open(my $file, '<' , "test.csv");
my @all_data;
while(my $data = <$file>){
    chomp($data);
    if($data){
        $data =~ s/^\s+//;
        $data =~ s/\s+$//;
        my $string = qq{($data)};
        push(@all_data,$string)
    }
}
close $file;
my $sql_string = join(',',@all_data);

my $dbname   = "DBName";
my $dsn      = "dbi:SQLite:dbname=$dbname";
my $username = "user";
my $password = "pass";
my $dbh = DBI->connect($dsn, $username , $password, {
   PrintError       => 0,
   RaiseError       => 1,
   AutoCommit       => 1,
   FetchHashKeyName => 'NAME_lc',
});
my $sql = qq{INSERT INTO ServerDetails (server, id) VALUES $sql_string};
$dbh->do($sql);
$dbh->disconnect;

सिंगल इंसर्ट के लिए नीचे दिए गए कोड का उपयोग करें:

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

my $dbname   = "DBName";
my $dsn      = "dbi:SQLite:dbname=$dbname";
my $username = "user";
my $password = "pass";
my $dbh = DBI->connect($dsn, $username, $password, {
   PrintError       => 0,
   RaiseError       => 1,
   AutoCommit       => 1,
   FetchHashKeyName => 'NAME_lc',
});
open(my $file, '<' , "test.csv");
while(my $data = <$file>){
    chomp($data);
    if($data){
        $data =~ s/^\s+//;
        $data =~ s/\s+$//;
        my $sql = qq{INSERT INTO ServerDetails (server, id) VALUES ($data)};
        $dbh->do($sql);
    }
}
close $file;
$dbh->disconnect;
0
KBSR 4 पद 2015, 12:52

अपने कोड में इस बिंदु पर आप केवल अपने डेटाबेस से जुड़े हैं। कृपया यहां एक उदाहरण देखें स्टैकओवरफ्लो में जो आपको यह देखने में मदद कर सकता है कि आपके अगले चरण क्या हो सकते हैं (यह MySQL को संदर्भित करता है लेकिन यह अभी भी शिक्षाप्रद है):

MySQL DB में पर्ल डालने का कार्य

इसके अलावा, मैं सुझाव दूंगा कि उपयोगकर्ता मैट जैकब ने अपनी टिप्पणियों में और टिम बेंस और एलीगेटर डेसकार्टेस द्वारा "द प्रोग्रामिंग विद द पर्ल डीबीएल: डाटाबेस प्रोग्रामिंग विद पर्ल" का उल्लेख किया है।

HTH

0
Community 23 मई 2017, 12:07