Perl-Skript zum exportieren von sql-Abfrage in csv
Den code unten funktioniert, aber alle Daten zeigt, die in einer Reihe(aber unterschiedlichen Spalten) beim öffnen in Excel. Die Abfrage SOLL die Daten anzeigen, die überschriften der Zeile 1 und Zeile 2. Auch, wenn ich die Datei öffnen, ich bekomme eine Warnung, die sagt, dass die Datei, Die Sie versuchen zu öffnen, wird, " xxxx.csv', ist in einem anderen format als spezifiziert durch die Datei-Erweiterung. Stellen Sie sicher, dass die Datei nicht beschädigt ist...usw. Möchten Sie die Datei öffnen?" Trotzdem, dass zu beheben? Das kann die Ursache auch.
tldr; export zu csv mit mehreren Zeilen, nicht nur eines. fix Excel-Fehler. Danke!
#!/usr/bin/perl
use warnings;
use DBI;
use Text::CSV;
# local time variables
($sec,$min,$hr,$mday,$mon,$year) = localtime(time);
$mon++;
$year += 1900;
# set name of database to connect to
$database=MDLSDB1;
# connection to the database
my $dbh = DBI->connect("dbi:Oracle:$database", "", "")
or die "Can't make database connect: $DBI::errstr\n";
# some settings that you usually want for oracle 10
$dbh->{LongReadLen} = 65535;
$dbh->{PrintError} = 0;
# sql statement to run
$sql="select * from eg.well where rownum < 3";
my $sth = $dbh->prepare($sql);
$sth->execute();
my $csv = Text::CSV->new ( { binary => 1 } )
or die "Cannot use CSV: ".Text::CSV->error_diag ();
open my $fh, ">:raw", "results-$year-$mon-$mday-$hr.$min.$sec.csv";
$csv->print($fh, $sth->{NAME});
while(my $row = $sth->fetchrow_arrayref){
$csv->print($fh, $row);
}
close $fh or die "Failed to write CSV: $!";
Nun, zunächst einmal, Sie versuchen zu drucken, die eine array-Referenz in einer Datei umgehen...das wird Ergebnis in Zeilen wie
Auch, Sie haben absolut keine Fehlerkontrolle, deshalb haben Sie keine Möglichkeit zu sagen, ob Sie haben erfolgreich eine Verbindung mit der Datenbank, ob die Tabelle
Und darüber hinaus, es sei denn, du bist Codierung einer Wegwerf-one-liner, sollten Sie
Ok, ich werde sicher sein, das zu tun. In meiner Verteidigung habe ich angefangen zu lernen perl-gestern und habe google um Hilfe haha
ARRAY(0x323523)
usw. Vertrauen Sie nicht Excel. Haben Sie keine Angst, um wirklich zu sehen, den Inhalt einer csv-Datei (über cat
, vi
, etc).Auch, Sie haben absolut keine Fehlerkontrolle, deshalb haben Sie keine Möglichkeit zu sagen, ob Sie haben erfolgreich eine Verbindung mit der Datenbank, ob die Tabelle
eg.well
vorhanden ist, ob die Abfrage erfolgreich durchgeführt wurde, ob keine Zeilen zurückgegeben wurden, etc.Und darüber hinaus, es sei denn, du bist Codierung einer Wegwerf-one-liner, sollten Sie
use strict
.Ok, ich werde sicher sein, das zu tun. In meiner Verteidigung habe ich angefangen zu lernen perl-gestern und habe google um Hilfe haha
InformationsquelleAutor Scuba_Steve | 2012-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
CSV-Zeilen sind getrennt durch Zeilenumbrüche. Einfach fügen Sie einen Zeilenumbruch nach jeder Zeile.
$csv->print($fh, "\n");
Diese Linie sollte
print $fh "\n";
weil die $csv-Objekts erwartet ein array, das hält die Zeile gedruckt werden. Ich habe ein edit, aber es muss überprüft werden.InformationsquelleAutor mawburn
Ich denke, eine andere Lösung ist die Verwendung der Instanziierung des
Text::CSV
- Objekt, und übergeben Sie entlang der gewünschten Linie eine Kündigung gibt...wird:
InformationsquelleAutor Joe