For Programmers: Free Programming Magazines  


Home > Archive > PERL Beginners > April 2008 > delete columns csv file









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author delete columns csv file
E-Letter

2008-04-02, 10:13 pm

Readers,

I have a csv file (greater than 256 columns hence unable to open in
spreadsheet) of the following format:

column header1, column header2, column header3
1,0.0e0,0.0e0,5e-6
2,0.0e0,0.0e0,6e-7
3,0.0e0,0.0e0,0.0e0

I want to perform: "if column headerx contains only values of 0.0e0,
delete the column (including the column header).

How do I start please?

Yours,

mandriva 2008
perl 588121
Rob Dixon

2008-04-02, 10:13 pm

e-letter wrote:
>
> I have a csv file (greater than 256 columns hence unable to open in
> spreadsheet) of the following format:
>
> column header1, column header2, column header3
> 1,0.0e0,0.0e0,5e-6
> 2,0.0e0,0.0e0,6e-7
> 3,0.0e0,0.0e0,0.0e0
>
> I want to perform: "if column headerx contains only values of 0.0e0,
> delete the column (including the column header).
>
> How do I start please?


The Text::CSV module will be useful.

I suggest you do this in two passes: run through the file once to work
out which columns should be deleted, then a second time copying all but
the deleted columns to an output file.

Does this help get you started?

Rob
John W. Krahn

2008-04-03, 8:11 am

e-letter wrote:
> Readers,


Hello,

> I have a csv file (greater than 256 columns hence unable to open in
> spreadsheet) of the following format:
>
> column header1, column header2, column header3
> 1,0.0e0,0.0e0,5e-6
> 2,0.0e0,0.0e0,6e-7
> 3,0.0e0,0.0e0,0.0e0
>
> I want to perform: "if column headerx contains only values of 0.0e0,
> delete the column (including the column header).
>
> How do I start please?


This may work for you:

#!/usr/bin/perl
use warnings;
use strict;
use Fcntl ':s';

@ARGV = 'somefile.csv';
$^I = '.back';

my @headers = map 1, split /,/, <>, -1;
my @keep = ( undef ) x @headers;

while ( <> ) {
chomp;
my @fields = split /,/, $_, -1;
for my $i ( 0 .. $#fields ) {
$keep[ $i ] = $i if $fields[ $i ] ne '0.0e0';
}
last if @headers == grep defined, @keep;
}

@keep = grep defined, @keep;

s ARGV, 0, SEEK_SET or die "Cannot s on '$ARGV' $!";

while ( <> ) {
chomp;
print join( ',', ( split /,/, $_, -1 )[ @keep ] ), "\n";
}

__END__


John
--
Perl isn't a toolbox, but a small machine shop where you
can special-order certain sorts of tools at low cost and
in short order. -- Larry Wall
John W. Krahn

2008-04-03, 8:11 am

John W. Krahn wrote:
> e-letter wrote:
>
> Hello,
>
>
> This may work for you:
>
> #!/usr/bin/perl
> use warnings;
> use strict;
> use Fcntl ':s';
>
> @ARGV = 'somefile.csv';
> $^I = '.back';
>
> my @headers = map 1, split /,/, <>, -1;
> my @keep = ( undef ) x @headers;
>
> while ( <> ) {
> chomp;
> my @fields = split /,/, $_, -1;
> for my $i ( 0 .. $#fields ) {
> $keep[ $i ] = $i if $fields[ $i ] ne '0.0e0';
> }
> last if @headers == grep defined, @keep;


That would probably be more efficient as:

exit 0 if @headers == grep defined, @keep;


> }
>
> @keep = grep defined, @keep;
>
> s ARGV, 0, SEEK_SET or die "Cannot s on '$ARGV' $!";
>
> while ( <> ) {
> chomp;
> print join( ',', ( split /,/, $_, -1 )[ @keep ] ), "\n";
> }
>
> __END__



John
--
Perl isn't a toolbox, but a small machine shop where you
can special-order certain sorts of tools at low cost and
in short order. -- Larry Wall
E-Letter

2008-04-03, 8:11 am

> > This may work for you:
>
> That would probably be more efficient as:
>
> exit 0 if @headers == grep defined, @keep;
>
>
>
>

I tried the original code above and received the following error:

s() on closed filehandle ARGV at filename.pl line 24, <> line 52.
Cannot s osn 'filename2.csv' Bad file descriptor at filename.pl
line 24, <> line 52

Since the file has 32 lines I was by the reference to 'line
52', so I deleted the empty line below _END_ and then repeated the
command:

perl filename.pl

Nothing happened except that the cursor in the command terminal moved
to the next line and remained, flashing without the [...] prefix. I
pressed crtl c and looked at the file using mc. The result was that my
csv file was totally emptied of content, i.e. became an empty file.

So I went to search for the text::csv module. I tried to check if this
was installed, with the resulting command terminal output:

perl -MText::CSV e -1
Can't open perl script "e": No such file or directory
$ perl -e "print qq(@INC)"
/usr/lib/perl5/5.8.8/i386-linux /usr/lib/perl5/5.8.8
/usr/lib/perl5/site_perl/5.8.8/i386-linux
/usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux
/usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl .
$ perl -MText::CSV_XS e -1
Can't open perl script "e": No such file or directory

So now I have no idea how to even check whether the module is already installed.

Next I tried to see if there is any documentation: below is my command
terminal output:

ls /usr/share/doc/perl
perl-AppConfig/ perl-IO-Socket-INET6/
perl-Archive-Cpio/ perl-IO-Socket-SSL/
perl-Archive-Tar/ perl-IO-Tty/
perl-Authen-SASL/ perl-IO-Zlib/
perl-Cairo/ perl-IP-Country-2.23/
perl-CGI-3.29/ perl-Libconf/
perl-Class-Singleton/ perl-libwww-perl/
perl-Compress-Raw-Zlib/ perl-Locale-gettext/
perl-Compress-Zlib/ perl-Mail-SPF/
perl-Config-IniFiles/ perl-Mail-SPF-Query/
perl-Crypt-SSLeay/ perl-MailTools/
perl-Curses/ perl-MDK-Common/
perl-Curses-UI/ perl-MDV-Distribconf/
perl-DateTime/ perl-MDV-Packdrakeng/
perl-DateTime-Locale/ perl-MIME-Lite/
perl-DateTime-TimeZone/ perl-Net-CIDR-Lite/
perl-DBD-mysql/ perl-Net-DBus/
perl-DB_File/ perl-Net-DNS/
perl-DBI/ perl-Net-Ident/
perl-Digest-HMAC/ perl-Net-IP/
perl-Digest-SHA1-2.11/ perl-Net-Jabber-2.0/
perl-Encode-Detect/ perl-Net_SSLeay.pm/
perl-Error/ perl-Net-Telnet/
perl-Expect/ perl-Net-XMPP/
perl-File-BaseDir/ perl-Params-Validate/
perl-File-DesktopEntry/ perl-RPM4/
perl-File-FnMatch-0.02/ perl-SOAP-Lite/
perl-File-MimeInfo/ perl-Socket6/
perl-Glib/ perl-String-CRC32/
perl-Gnome2-Print/ perl-String-ShellQuote/
perl-Gnome2-Vte/ perl-SVN/
perl-Gtk2/ perl-Sys-Hostname-Long/
perl-Gtk2-Html2/ perl-Term-ReadKey/
perl-Gtk2-NotificationBubble/ perl-TimeDate/
perl-Gtk2-SourceView-1.000/ perl-URI/
perl-Gtk2-TrayIcon/ perl-URPM/
perl-HTML-Parser/ perl-version/
perl-HTML-Tagset/ perl-XML-Parser/
perl-IO-Compress-Base/ perl-XML-Stream-1.22/
perl-IO-Compress-Zlib/ perl-Youri-Package-RPM-Updater/

No idea what this all means! I thought I would try and learn word by
word, so trying to find out what 'fcntl' means; no idea where to
start???

Totally bewildered!

Yours,[color=darkred]
>
>
> John
> --
> Perl isn't a toolbox, but a small machine shop where you
> can special-order certain sorts of tools at low cost and
> in short order. -- Larry Wall
>
> --
> To unsubscribe, e-mail: beginners-unsubscribe@perl.org
> For additional commands, e-mail: beginners-help@perl.org
> http://learn.perl.org/
>
>
>

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com