RE: :XBase, STDOUT, and IO issue
am 10.05.2006 15:53:33 von Philip.Garrett-----Original Message-----
From: Mark Galbreath [mailto:GalbreathM@gao.gov]=20
Sent: Wednesday, May 10, 2006 9:11 AM
To: dbi-users@perl.org
Subject: DBD::XBase, STDOUT, and IO issue
>=20
> Hi Guys,
> =20
> I'm using a subclass of DBI called DBD::XBase for reading Oralce DBF
> tablespace datafiles, translating them into delimited text files, and
> then loading them into MySQL with DBI. The problem is the only way
> DBD:XBase can output the text file with field delimiters I need is it
> slurps the whole file to STDOUT. So I did this (don't laugh):
> =20
> my $table =3D new XBase;
> open STDOUT, ">data.txt";
> $table->dump_records( "fs" =3D> "|" );
> close STDOUT;
> =20
> This does exactly what I need, except that now STDOUT is closed for
> further output (like for print statements), and if I do not close it,
> all STDOUT goes to the data file (I told you not to laugh!).
>
> I searched all night and cannot find an example of how to do this
> correctly. Capture the table dump's STDOUT with IO::Pipe somehow? The
> documentation of IO::Pipe is pretty sparse. Any suggestion is greatly
> appreciated.
This should do it:
use IO::Handle;
no warnings 'once'; # perl doesn't see the 2nd ref in the string
# temporarily replace STDOUT
open( SAVED_STDOUT, ">&STDOUT" ) or die "can't dup stdout: $!";
open( OUT_FILE, ">", "data.txt") or die "can't create file: $!";
STDOUT->fdopen(fileno(OUT_FILE), "w") || die "can't fdopen: $!";
# print data to temporary STDOUT
$table->dump_records( "fs" =3D> "|" );
# restore STDOUT
open( STDOUT, ">&SAVED_STDOUT" ) or die "can't dup saved: $!";
# close/flush data file
close(OUT_FILE) || die "can't close: $!";
Hth,
Philip