我有一个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
答案 0 :(得分:1)
主要问题是您通过在Windows资源管理器中双击其文件名来运行程序。
<>
的工作方式是它将从您在命令行中指定的任何文件(显示在@ARGV
数组中)读取,或者,如果该数组为空,则它将读取来自STDIN
- 通常是键盘。
双击该文件不会给它提供命令行参数,因此等待您在出现的黑色窗口中键入输入。这意味着您已输入<RTR-DATA.CSV
作为while
循环的输入,而Perl尝试将其拆分为逗号,只提供一个字段,因此将$location
设置为{{ 1}}。不是你想要的!
因此,如果您通过输入
从<RTR-DATA.CSV
窗口运行程序
cmd
然后在程序create-configs.pl RTR-DATA.CSV
中将包含@ARGV
,RTR-DATA.CSV
将自动从该文件中读取
以下是您的代码的进一步说明
Windows系统上不需要<>
行,通常将#!
文件扩展名绑定到perl可执行文件
您必须始终 .pl
和use strict
位于您编写的每个Perl程序的顶部,并在第一个使用点声明所有变量。这会给你一些关于问题性质的非常强有力的线索
您通常应该use warnings
从文件中读取每一行,因为如果将它留在{{返回的最后一个字段的末尾,它会在最后产生一个可能导致问题的换行符。 1}}
在这种情况下,您还应该在要分割的模式中的逗号两侧添加可选空格,以便从它返回的字段中删除前导和尾随空格
您应始终使用词法文件句柄(chomp
而不是split
)使用三参数形式的$out_fh
这里重写了你的代码,考虑了所有这些要点。我希望它有所帮助
OFILE
答案 1 :(得分:0)
使用Text :: CSV来解析CSV文件和Template Toolkit或类似工具来进行模板化。不要重新发明轮子。