in reply to Converting a txt file to excel file

To convert a tab-delimited text file into Excel, you simply open it in excel, you don't need no stinkin' perl.

update the word stinkin' is a joke, no offence meant :-) ... cf. Treasure of the Sierra Madre

update2 yes, of course perl can be brought into the mix, and modules like Spreadsheet::WriteExcel and DBD::Excel can be useful for that.

MonkPaul PLEASE stop changing your node. This website is intended to be a permanent record to help others with questions. Never erase a node's content, rather use update as I have. Think about other people coming to the site - they want to be able to read a node and see the responses in a way that answers questions. If you start a new question, start a new node. If you modify your question, update it, don't erase it and start over.

  • Comment on Re: Converting a txt file to excel file

Replies are listed 'Best First'.
Re^2: Converting a txt file to excel file
by ww (Archbishop) on Apr 02, 2005 at 17:51 UTC
    re jZed's, suspect either
    (1) there's some trick I don't know
    or
    (2)"simply" may be an oversimplification.

    Excel has better luck (for me, anyway) with text files beginning at fixed column locations; takes mucho twiddling to get it to handle tabs correctly if text (of NON-uniform length) includes numerals unless data intended for each cell is double-quoted.

    and, <G>, isn't it "don't need no steenkin'...?"
Re^2: Converting a txt file to excel file
by tlm (Prior) on Apr 02, 2005 at 19:07 UTC

    Sure, I assume the OP knows that and is asking in PM because he has a big raft of these files to convert and wants to do it programmatically. It's no fun to convert 500 tab-delimited files by opening them from within Excel, even if one uses the "lazy-evaluation" model.

    the lowliest monk

      The point i was trying to make was that the user shouldnt have to leave the web page environment, but should only have to choose which file they want to view the data of.

      The user doesnt want to see any of the actual raw data, but merely an overall graph to display the data on the screen in a graphical format that can easily be understood.

      ** not meaning to be arsey about it :)****

      I may be a bit stupid but can you tell me of a way that i can loop through all the column headings in the file (say writing them to the screen), i.e. stored in an array, then for each row do the same. Currently i have the following code, although i know it doesnt work. I was thinking of a hash table for the column and value but im new to this perl game. The problem i have is to recognise the number of columns there are and loop through each row upto and including the last column, then go to the next line and start again. My brain is wrecked at this stage. Im normally a java programmer and cant seem to see a way forward....HELP!.

      # read from a file and extract the contents into an Excel file sub write_to_Excel() { use Spreadsheet::WriteExcel; my @columnNames; my @rowValues; my $count = 0; my $row = 0; my $fileArray = "F:/User_Interface/dbStuff/ArrayExpress.txt"; open( INFILE, "<$fileArray") or die "Cannot open the file"; print("Searching File..."); foreach $line ( <INFILE> ) { if( $line =~ /^Name/ ) { @columnNames = split(/\t/, $line); } else { @rowValues = split(/\t/, $line); } } # Create a new workbook and save a file called example.xls # and add a worksheet called Summary to that. my $workbook = Spreadsheet::WriteExcel->new("ArrayExpress.xls"); my $worksheet = $workbook->add_worksheet(`Summary`); # Set text bold, red, underlined for values # designated as high # my $high_val = $workbook->add_format(); # $high_val->set_bold(); # $high_val->set_color(`red`); # $high_val->set_underline(); ###### not sure how to loop through array to put rows across then do +wn and same with cols $worksheet->write($row,$count,$element); foreach $element(@columnNames) { $count++; $worksheet->write($row,$count,$element); } foreach my $element(@rowValues) { $worksheet->write($row,$count,$element); $count++; $row++; } }

      Sorry about the mess with the node changing. Again im new to this.
      MonkPaul.

        First, you are saving only one row. Fix it with something like:

        foreach $line ( <INFILE> ) { if( $line =~ /^Name/ ) { @columnNames = split(/\t/, $line); } else { push @rowValues, [ split(/\t/, $line) ]; } }
        Second, you are setting and/or incrementing the row and column indexes inappropriately (you also have an extraneous write right before the first loop); fix it with something like:
        $row = 0; $count = 0; foreach $element(@columnNames) { $worksheet->write($row,$count,$element); $count++; } ++$row; foreach my $rv (@rowValues) { $count = 0; foreach my $element (@$rv) { $worksheet->write($row,$count,$element); $count++; } $row++; }
        Third, you are not using strict (q.v.), and are therefore heading for a world of pain.

        Im normally a java programmer and cant seem to see a way forward...

        If you think the problems with the code you posted had something to do with it being in Perl rather than Java I think you are missing the boat; the most serious errors in it are pretty generic.

        the lowliest monk