我正在使用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
这是可能的,提前感谢所有的帮助。
答案 0 :(得分:0)
关于你的第2点,为了跳过这些线,你可以使用'next if',跳过相关的线:
next if ($line =~ /Place_of_Destination/)
或'除非',如您所愿:
unless ($line =~ /Place_of_Destination/) {
# do something
}
如果我理解你正在尝试做什么,这个测试将在你的第二个'while'循环中使用。