0
votes

I am using below solution from earlier solution from Alan, which works to combine text files with Pipe Character. Thanks !

Merge multiple text files and append current file name at the end of each line

#!/usr/bin/env perl
use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new( { 'sep_char' => '|' } );

open my $fho, '>', 'combined.csv' or die "Error opening file: $!";

while ( my $file = <*.txt> ) {
    open my $fhi, '<', $file or die "Error opening file: $!";
    ( my $last_field = $file ) =~ s/\.[^\.]+$//;  # Strip the file extension off
while ( my $row = $csv->getline($fhi) ) {
    $csv->combine( @$row, $last_field );  # Construct new row by appending the file           name without the extension
    print $fho $csv->string, "\n";        # Write the combined string to combined.csv
    }
}

If anyone could help enhance the solution with following 3 more requirements, would be helpful.

1) Within my text data, some data is within quotation marks in forllowing format; |"XYZ NR 456"|

Above solution is placing these data into different columns when I open the final combine.csv file, Is there a way to ensure all data remains combined within pipe character when merged.

2) Delete an entire line where it finds word Place_of_Destination

3) Current solution adds the filename at end of each line. I also want to split the file name with pipe characters

My filename structure is X_INRUS6_08072013.txt, solution adds pipe character and filename X_INRUS6_08072013 at the end of each line, What I also want to do is to split this file name further in following ; X | INRUS6 | 08072013

Is this possible, Thanks in advance for all the help.

1

1 Answers

0
votes

As for your point 2, in order to skip the lines, you could use a 'next if', with the effect of skipping the line concerned:

next if ($line =~ /Place_of_Destination/)

or 'unless', as your wish:

unless ($line =~ /Place_of_Destination/) {
    # do something
}

If I understood properly what you are trying to do this test is to be used in your second 'while' loop.