Reputation: 21
I am new to Perl and need to take a tab delimited file with 12 rows and 8 columns, perform some calculations on the data, and then export it to a new file with the same format of rows and columns. I am assuming I need to import the file to an array but is there something special about the import? I'm not sure if I need to import to multiple arrays or a multi-dimensional array or just a normal array for all of the data. Then is there anything special about exporting the data so that it's in the same format? I'm lost! Hope this makes sense! Here is what I have done so far:
#Pseudocode:
#Ask user for the path to the input file
#Ask user for the dilution factor
#Ask user for the path to the output file
#Read in the file with columns and rows
#Put all data into 1 array
#For each index of above array:
#Multiply given OD readings by 50ug/ul
#Multiply all readings by dilution factor from user
#Print converted values into the tab-delimited output folder with 12 columns * 8 rows
#Add header to output file to describe what was done
##################################################
#This program converts absorbance data from a file into DNA concentration based on a standard conversion
#factor of 50ug/ul and a dilution factor given by a user.
#It then prints the converted values into an output folder of the same dimensions of the original and adds a header.
#!/usr/bin/perl -w
print "Please enter the pathway to the file containing the UV spec data: \n";
$input_file = <STDIN>;
chomp $input_file;
unless (open(INPUTFILE, $input_file))
{
print "Cannot open file \"$input_file\"\n\n";
exit;
}
@input_data = <INPUTFILE>;
close INPUTFILE;
$input_data = join('', @input_data); #puts data into a single string for easier processing???
$input_data =~ s/\s//g; #remove any whitespace
print "Please enter the dilution factor for these samples: \n";
$dilution_factor = <STDIN>;
chomp $dilution_factor;
foreach my $calc_data (@input_data)
{
my $new_conc = $input_data * 50 * $dilution_factor;
return $new_conc;
}
print "Please enter the pathway for the file you you want to save the converted data in: \n";
$output_file = <STDIN>;
Upvotes: 2
Views: 2473
Reputation: 21
#!/usr/bin/perl -w
$header = 'This file gives the concentration of the DNA based on OD value, dilution, and concentration.';
print "Please enter the pathway to the file containing the UV spec data: \n";
$input_file = <STDIN>;
chomp $input_file;
unless (open(INPUTFILE, $input_file))
{
print "Cannot open file \"$input_file\"\n\n";
exit;
}
close INPUTFILE;
# Get the dilution factor from the command line
my $dilute = shift;
# Get the input (all at once)
my $input_data = do { local $/; <> };
# Change the values.
$input_data =~ s/(\d+\.\d+)/$1 * 50 * $dilute/eg;
# Write the output to the output file
$output_file = "calc_values";
unless (open(CALCVALUES, ">$output_file"))
{
print "Cannot open file \"$output_file\"\n\n";
exit;
}
format CALCVALUES =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<...
$header
^<<<<<<<<<<<~~
$output_file
.
write;
exit;
Upvotes: 0
Reputation: 69224
I've changed the interface of the program slightly in order to simplify it. Assuming this is in a file called dilute.pl
, you call it like this (with a dilution factor of 0.1):
$ ./dilute.pl 0.1 < input.dat > output.dat
The code looks like this:
#!/usr/bin/perl
use strict;
use warnings;
# Get the dilution factor from the command line
my $dilute = shift;
# Get the input (all at once)
my $input = do { local $/; <> };
# Change the values.
# This assumes that your input is all floating point numbers.
# You might need to tweak the regex if that's not the case.
$input =~ s/(\d+\.\d+)/$1 * 50 * $dilute/eg;
# Write the output
print $input;
Upvotes: 2
Reputation: 3045
You could try using the Text::CSV_XS module. The documentation has very nice examples. The advantage of using this is that you won't have a problem with values that contain a tab, while if you use split
you need to check if a tab is between double quotes, e.g. "foo\tbar"
.
Upvotes: 0