使用Perl合并CSV文件

时间:2015-04-11 08:36:14

标签: windows perl csv

我有一个CSV文件,我需要使用以下Perl代码进行合并,但我无法运行它。它应该放出多个文本文件,但它不起作用。

#!/usr/local/bin/perl
#
$template_file_name="rtr-template.txt";
while(<>) {

   ($location, $name, $lo0ip, $frameip, $framedlci, $eth0ip, $x) 
       = split (/,/);

   open(TFILE, "< $template_file_name") || die "config template file $template_file_name: 
$!\n";
   $ofile_name = $name . ".txt";
   open(OFILE, "> $ofile_name") || die "output config file $ofile_name: $!\n";

   while (<TFILE>) {

     s/##location##/$location/;
     s/##rtrname##/$name/;
     s/##eth0-ip##/$eth0ip/;
     s/##loop0-ip##/$lo0ip/;
     s/##frame-ip##/$frameip/;
     s/##frame-DLCI##/$framedlci/;

     printf OFILE $_;
   }
}

CSV文件如下所示

Toronto, Router1, 172.25.15.1, 172.25.16.6,101, 172.25.100.1

这是 rtr-template.txt 文件

!
version 12.1
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
!
hostname ##rtrname##
!
enable password cisco
enable secret cisco
!
interface Loopback0
 ip address ##loop0-ip## 255.255.255.255
!
interface Serial0/0
 description Frame-Relay Circuit 
 no ip address
 encapsulation frame-relay
 ip route-cache policy
 frame-relay lmi-type ansi
 no shutdown
!
interface Serial0/0.1 point-to-point
 ip address ##frame-ip## 255.255.255.252
 frame-relay interface-dlci ##frame-DLCI##
!
interface FastEthernet0/1
 description User LAN Segment
 ip address ##eth0-ip## 255.255.255.0
 no shutdown
!
router eigrp 99
 network 172.25.0.0
!
snmp-server location ##location##
!
line con 0
 password cisco
 login
 transport input none
line aux 0
 password cisco
 login
line vty 0 4
 password cisco
 login
 transport input telnet
!
end

2 个答案:

答案 0 :(得分:1)

主要问题是您通过在Windows资源管理器中双击其文件名来运行程序。

<>的工作方式是它将从您在命令行中指定的任何文件(显示在@ARGV数组中)读取,或者,如果该数组为空,则它将读取来自STDIN - 通常是键盘。

双击该文件不会给它提供命令行参数,因此等待您在出现的黑色窗口中键入输入。这意味着您已输入<RTR-DATA.CSV作为while循环的输入,而Perl尝试将其拆分为逗号,只提供一个字段,因此将$location设置为{{ 1}}。不是你想要的!

因此,如果您通过输入

<RTR-DATA.CSV窗口运行程序
cmd

然后在程序create-configs.pl RTR-DATA.CSV 中将包含@ARGVRTR-DATA.CSV将自动从该文件中读取

以下是您的代码的进一步说明

  • Windows系统上不需要<>行,通常将#!文件扩展名绑定到perl可执行文件

  • 必须始终 .pluse strict位于您编写的每个Perl程序的顶部,并在第一个使用点声明所有变量。这会给你一些关于问题性质的非常强有力的线索

  • 您通常应该use warnings从文件中读取每一行,因为如果将它留在{{返回的最后一个字段的末尾,它会在最后产生一个可能导致问题的换行符。 1}}

  • 在这种情况下,您还应该在要分割的模式中的逗号两侧添加可选空格,以便从它返回的字段中删除前导和尾随空格

  • 您应始终使用词法文件句柄(chomp而不是split)使用三参数形式的$out_fh

这里重写了你的代码,考虑了所有这些要点。我希望它有所帮助

OFILE

答案 1 :(得分:0)

使用Text :: CSV来解析CSV文件和Template Toolkit或类似工具来进行模板化。不要重新发明轮子。