RE: :XBase, STDOUT, and IO issue

RE: :XBase, STDOUT, and IO issue

am 10.05.2006 15:58:28 von GalbreathM

--=__Part280D0094.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

Outstanding! I forgot about the & pointer! Thanks a million, Philip!
=20
mark

>>> "Garrett, Philip (MAN-Corporate)" =
10-May-06 09:53:33 AM >>>

-----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



--=__Part280D0094.1__=--