Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: dbf_dump to apply to multiple files in a directory

by AppleFritter (Vicar)
on Aug 03, 2014 at 11:36 UTC ( [id://1096057]=note: print w/replies, xml ) Need Help??


in reply to dbf_dump to apply to multiple files in a directory

Howdy solanum, welcome to the Monastery!

You don't actually need Perl for this. The following would also work (if you're using bash or a similar shell; I don't have any experience with C shells):

$ for i in *.dbf; do dbf_dump --fs "," "$i" >"$i.csv"; done

If you want to use Perl, my anonymous brothers have already provided some advice. The main problem with your script is that you're trying to call an external command (dbf_dump) as you would from a shell script. But Perl isn't a shell, it's a programming language, so you have to use a function like system to run external commands.

The error you're getting is related to that: "bareword found where operator expected, near "--fs"" tells you that Perl is trying to parse your dbf_dump invocation as Perl and failing to make sense of it.

Replies are listed 'Best First'.
Re^2: dbf_dump to apply to multiple files in a directory
by solanum (Initiate) on Aug 03, 2014 at 19:14 UTC

    Unfortunately, this needed to be done in perl. However, thank you, I will keep this in mind

      You're welcome!

      Here's another tip: although you can of course use opendir and grep to get your list of files, Perl also has a built-in function called glob for filename expansions. Using that, the code that my anonymous brother posted in Re: dbf_dump to apply to multiple files in a directory simplifies to:

      #!/usr/bin/env perl use warnings; use strict; use IPC::System::Simple qw/system/; # recommended but optional foreach my $file (glob "*.dbf") { system(qq{dbf_dump --fs "," "$file" > "$file.csv"}) == 0 or die "system() failed (\$?=$?)"; }

      I've also replaced $_ with $file here -- $_ is not otherwise used and never assigned any value --, and put quotes around the CSV file's name to avoid problems with filenames that contain spaces.

        I think glob should always come with a disclaimer to read its docs (including File::Glob) because it has a lot of functionality under the hood. In this case it may work fine, but for example it won't list files that begin with a dot. And once people start writing glob($pattern_I_got_somewhere) things can get real fun with wildcards and such.

        Whenever I don't want glob's features getting in the way of having full control of which files get listed, I prefer readdir or File::Find.

        P.S. Thanks for catching the $_, I missed that above.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1096057]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (3)
As of 2024-04-19 22:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found