Perl:合并多个文本文件和拆分文件名

时间:2013-07-16 15:49:41

标签: perl merge split

我正在使用Alan的早期解决方案的下面的解决方案,该解决方案用于将文本文件与Pipe Character结合起来。谢谢!

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
    }
}

如果有人可以通过满足以下3个要求来帮助增强解决方案,那将会很有帮助。

1)在我的文本数据中,某些数据在以下格式的引号内; |"XYZ NR 456"|

上面的解决方案是在打开最终的combine.csv文件时将这些数据放入不同的列中。是否有办法确保合并时所有数据仍然在管道字符内组合。

2)删除找到单词Place_of_Destination

的整行

3)当前解决方案在每行末尾添加文件名。我还想用管道符分割文件名

我的文件名结构是X_INRUS6_08072013.txt,解决方案在每行的末尾添加管道字符和文件名X_INRUS6_08072013,我还想做的是在下面进一步拆分这个文件名; X | INRUS6 | 08072013

这是可能的,提前感谢所有的帮助。

1 个答案:

答案 0 :(得分:0)

关于你的第2点,为了跳过这些线,你可以使用'next if',跳过相关的线:

next if ($line =~ /Place_of_Destination/)

或'除非',如您所愿:

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

如果我理解你正在尝试做什么,这个测试将在你的第二个'while'循环中使用。