Problem with Mail merge in perl


 
Thread Tools Search this Thread
Top Forums Programming Problem with Mail merge in perl
# 1  
Old 12-06-2011
Problem with Mail merge in perl

This could be a simple problem for the perl experts

I am trying mail merge in perl

The header file is head1 which is as under

,,ACTION,TRANS_ID,,TBL,ForwardDeals_Id,DealStatus,InputMode,CaptureDate,TradeDate,Users_Id,Users_Id_ Last,Folders_Id,Purposes_Id,TypeOfEvent,BlockNumber,TypeOfInstr_Id,Comments,Pairs_Id,Amount1,Amount2 ,

The file containing the values is csv which is as under

,,"INS",973795,,ForwardDeals,883797,V,I,"04/05/2009,04/05/2009,63768,0,63761,61987,K,887591,58935,"649978-booked,52006,-475000.0,23607500.0
,,"INS",973796,,ForwardDeals,883798,V,I,"04/05/2009,04/05/2009,63768,0,63761,61987,K,887592,58935,"649978-booked,52006,-575000.0,33607500.0
,,"INS",973797,,ForwardDeals,883799,V,I,"04/05/2009,04/05/2009,63768,0,63761,61987,K,887593,58935,"649978-booked,52006,-478000.0,23608500.0

The perl script is to merge the head and csv is

#!/usr/bin/perl
while ($f = (head1)) {
open (FH, $f) or die "Can't open $f : $!";
while (<FH>) {
chomp;
push @contents, $_;
@contents = split(/,/);
}
while (<>) {
chop() ;
push @values, $_;
@values = split(/,/);
$size = @values;
}
for ($i = 0 ;$i < $size ; $i++) {
printf "$contents[$i] $values[$i] \n" ;
}
}

I am able to get the merge for 1st row of the csv file and the head1 as under by executing

perl mail_merge.pl csv


ACTION "INS"
TRANS_ID 973795

TBL ForwardDeals
ForwardDeals_Id 883797
DealStatus V
InputMode I
CaptureDate "04/05/2009
TradeDate 04/05/2009
Users_Id 63768
Users_Id_Last 0
Folders_Id 63761
Purposes_Id 61987
TypeOfEvent K
BlockNumber 887591
TypeOfInstr_Id 58935
Comments "649978-booked
Pairs_Id 52006
Amount1 -475000.0
Amount2 23607500.0

I am not able to merge the head with the subsequent rows of csv .The desired output would be

ACTION "INS"
TRANS_ID 973795

TBL ForwardDeals
ForwardDeals_Id 883797
DealStatus V
InputMode I
CaptureDate "04/05/2009
TradeDate 04/05/2009
Users_Id 63768
Users_Id_Last 0
Folders_Id 63761
Purposes_Id 61987
TypeOfEvent K
BlockNumber 887591
TypeOfInstr_Id 58935
Comments "649978-booked
Pairs_Id 52006
Amount1 -475000.0
Amount2 23607500.0

ACTION "INS"
TRANS_ID 973796

TBL ForwardDeals
ForwardDeals_Id 883798
DealStatus V
InputMode I
CaptureDate "04/05/2009
TradeDate 04/05/2009
Users_Id 63768
Users_Id_Last 0
Folders_Id 63761
Purposes_Id 61987
TypeOfEvent K
BlockNumber 887592
TypeOfInstr_Id 58935
Comments "649978-booked
Pairs_Id 52006
Amount1 -575000.0
Amount2 33607500.0

Please guide ,Thanks in advance
# 2  
Old 12-06-2011
So you need to read the first line in as a header array and then on reading subsequent lines into an array write each header field and record field

Code:
perl -e 'open DATA, "<", "tmp.dat";
$record=readline(DATA);
@FieldNames=split/,/,$record;
while(<DATA>){
   @fields=split/,/,$_;
   for (0..$#fields){
      print "$FieldNames[$_]: $fields[$_]\n" if $fields[$_];
   }
   print "\n","="x80,"\n";
}'

This User Gave Thanks to Skrynesaver For This Post:
# 3  
Old 12-06-2011
Thanks Skrynesaver

I appended the csv to the head1 and renamed it as tmp.dat and got the desired output

But is there a way out in perl that the head and the csv are in two different files and still I get the output
# 4  
Old 12-06-2011
Sure, read the field names from head1 rather than off the top of the file and keep them as 2 separate arrays
This User Gave Thanks to Skrynesaver For This Post:
# 5  
Old 12-06-2011
Thanks again

I have tried as suggested , but am unable to get the first record of the csv file in the merge

The script is

#!/usr/bin/perl
open HEAD, "<", "head1";
$contents=readline(HEAD);
@FieldNames=split/,/,$contents;
open DATA, "<", "csv";
$record=readline(DATA);
while(<DATA>){
@fields=split/,/,$_;
for (0..$#fields){
print "$FieldNames[$_]: $fields[$_]\n" if $fields[$_];
}
print "\n","="x80,"\n";
}

The output is
ACTION: "INS"
TRANS_ID: 973796
TBL: ForwardDeals
ForwardDeals_Id: 883798
DealStatus: V
InputMode: I
CaptureDate: "04/05/2009
TradeDate: 04/05/2009
Users_Id: 63768
Folders_Id: 63761
Purposes_Id: 61987
TypeOfEvent: K
BlockNumber: 887592
TypeOfInstr_Id: 58935
Comments: "649978-booked
Pairs_Id: 52006
Amount1: -575000.0
Amount2: 33607500.0


================================================================================
ACTION: "INS"
TRANS_ID: 973797
TBL: ForwardDeals
ForwardDeals_Id: 883799
DealStatus: V
InputMode: I
CaptureDate: "04/05/2009
TradeDate: 04/05/2009
Users_Id: 63768
Folders_Id: 63761
Purposes_Id: 61987
TypeOfEvent: K
BlockNumber: 887593
TypeOfInstr_Id: 58935
Comments: "649978-booked
Pairs_Id: 52006
Amount1: -478000.0
Amount2: 23608500.0


================================================================================

The first record ie ForwardDeals_Id: 883798 is not merged , Please guide
# 6  
Old 12-06-2011
this line outside the loop is reading the DATA file, drop that line and yiou should be there.
Code:
$record=readline(DATA);

This User Gave Thanks to Skrynesaver For This Post:
# 7  
Old 12-06-2011
Thanks very much ,it is working
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

E-mail Output Merge Lines for Some Text..

Hi all. This is the content of the text file used for the e-mail: TM ICP-EDW BILLING REGISTER USAGE BREAKDOWN_01062014.csv TM_ICP_EDWH_FICL_13062014.TXT TM_ICP_EDWH_FICL_16062014.TXT TM_ICP_EDW_Detailed Payment Journal Report_13062014.txt TM_ICP_EDW_Detailed Payment Journal... (9 Replies)
Discussion started by: aimy
9 Replies

2. Shell Programming and Scripting

Awk or Perl - to selectively merge two files.

I have two files, these have to be selectively merged into two other files. In addition there will require to be a edit to the last field, where the date format is changed. The first file is a csv file with around 300k lines the data is now nearly 20 years old and I have been asked to move this... (7 Replies)
Discussion started by: gull04
7 Replies

3. Shell Programming and Scripting

merge multiple tables with perl

Hi everyone, I once again got stuck with merging tables and was wondering if someone could help me out on that problem. I have a number of tab delimited tables which I need to merge into one big one. All tables have the same header but a different number of rows (this could be changed if... (6 Replies)
Discussion started by: TuAd
6 Replies

4. Shell Programming and Scripting

How to merge 2 files based on delimeter in perl?

Hi, I have 2 files. a.txt & b.txt # a.txt contains the following text. apple grapes # b.txt contains the following text. banana pine My question is. (1 Reply)
Discussion started by: vanitham
1 Replies

5. Shell Programming and Scripting

Using Perl to Merge Multiple Lines in a File

I've hunted and hunted but nothing seems to apply to what I need. Any help will be much appreciated! My input file looks like (Unix): marker,allele1,allele2 RS1002244,1,1 RS1002244,1,3 RS1002244,3,3 RS1003719,2,2 RS1003719,2,4 RS1003719,4,4 Most markers are listed 3 times but a few... (2 Replies)
Discussion started by: Peggy White
2 Replies

6. Shell Programming and Scripting

perl merge two files by the time sequence

Hi Guys, i have two files: fileA: 20090611 00:00:11 20090611 00:00:11 20090611 00:00:24 20090611 00:01:10 20090611 07:13:00 fileB: 20090611 00:00:01 20090611 00:00:12 20090611 00:00:24 20090611 00:01:12 20090611 09:13:00 want to make two files into a single file, but follow the... (14 Replies)
Discussion started by: jimmy_y
14 Replies

7. Shell Programming and Scripting

Problem using mailx instead of mail in perl program

I have a perl program that uses the mail program to send emails. It works fine but because I want to change the return address on the emails to be different I need to use mailx with the "-r" option. the problem is when I change this line to use mailx I no longer recieve "any" emails. This works... (1 Reply)
Discussion started by: kieranfoley
1 Replies

8. Shell Programming and Scripting

Merge two files in windows using perl script

Hi I want to merge two or more files using perl in windows only(Just like Paste command in Unix script) . How can i do this.Is ther any single command to do this? Thanks Kunal (1 Reply)
Discussion started by: kunal_dixit
1 Replies

9. Shell Programming and Scripting

mail merge

dear friends plese give me full shell script for mail merge facilityu. i.e. to create a letter file i.e to create data file and report maile merge using shell scripitng. when run the programme ask for fields and store in a file and from another program when run that mail merge file... (3 Replies)
Discussion started by: cvvsnm
3 Replies

10. UNIX for Dummies Questions & Answers

mail problem (NOT Mail or Mail.app)

When I try to use the CLI mail, I get the following error. What's wrong? Welcome to Darwin! % mail root Subject: test test . EOT % /etc/mail/sendmail.cf: line 81: fileclass: cannot open /etc/mail/local-host-names: Group writable directory Do I just need to change the... (1 Reply)
Discussion started by: chenly
1 Replies
Login or Register to Ask a Question