0

我正在使用 Alan 早期解决方案中的以下解决方案,该解决方案用于将文本文件与管道字符结合起来。谢谢 !

合并多个文本文件并在每行末尾附加当前文件名

#!/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

这可能吗,在此先感谢您的帮助。

4

1 回答 1

0

至于您的第 2 点,为了跳过这些行,您可以使用“next if”,其效果是跳过相关行:

next if ($line =~ /Place_of_Destination/)

或“除非”,如您所愿:

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

如果我正确理解了您要执行的测试,则将在您的第二个“while”循环中使用该测试。

于 2013-07-16T16:46:52.967 回答