2011-08-24 125 views
4

我的测试文件具有“n”行数,并且每行之间有一个^ M,这反过来又使它成为一个大字符串。我正在使用的代码打开所述文件,并应解析出一个标题,然后解析出后续行,然后搜索目录路径和文件名。但由于文件刚刚结束了作为一个大的字符串不正确,当我在六,打开测试文件,我已经使用如何用perl中的新行替换^ M

:%s/^M/\r/g 

工作

#!/usr/bin/perl 
#use strict; 
#use warnings; 

open (DATA, "<file.txt") or die ("Unable to open file"); 

my $search_string = "Directory Path"; 
my $column_search = "Filename"; 
my $header = <DATA>; 
my @header_titles = split /\t/, $header; 
my $extract_col = 0; 
my $col_search = 0; 

for my $header_line (@header_titles) { 
    last if $header_line =~ m/$search_string/; 
    $extract_col++; 
} 
for my $header_line (@header_titles) { 
    last if $header_line =~m/$column_search/; 
    $col_search++; 
} 

print "Extracting column $extract_col $search_string\n"; 

while (my $row = <DATA>) { 
    last unless $row =~ /\S/; 
    chomp $row; 
    my @cells = split /\t/, $row; 
$cells[74]=~s/:/\//g; 
$cells[$extract_col]= $cells[74] . $cells[$col_search]; 
print "$cells[$extract_col] \n"; 

} 

和删除^ M的,但如何我是否在这个perl程序中执行它?当我尝试一个测试程序并插入s\^M/\r/g并且写入了另一个文件时,它就出现了很多中文字符。

+1

喜欢'打开我的$ DATA ,“<”,$ filename“打开DATA”,<$ filename“'。 – flies

回答

4

你开始阅读的文件之前,设置$/"\r"。这被默认设置为换行字符,对于UNIX风格的行结尾来说很好,对于DOS风格的行结尾几乎没问题,但对于你所看到的旧式的Mac风格的行尾却没有用处。如果安装了输入文件,也可以尝试使用mac2unix。

欲了解更多信息,请在the perlvar manpage中查找“INPUT_RECORD_SEPARATOR”。

+0

这也没有工作。 –

+0

运行dos2unix mac2unix我总是得到“跳过二进制文件” –

+0

您是否尝试更改输入记录分隔符? – mkb

0

此文件是否源于Windows系统?如果是这样,请尝试在读取文件之前对文件运行dos2unix命令。在读取它之前,您可以在调用perl脚本之前或脚本内部执行此操作。

+0

这实际上是旧OS X之前的Mac版本的结局。 (现在他们只是使用换行符)由于某些原因,Excel仍然会在行尾使用'\ r'而不是'\ n'导出CSV。 DOS文件都有。 – mkb

+0

当我运行命令时,我一直在获得“跳过二进制文件”..我相信在644 –

0

您可能需要设置$ \(输入记录分隔符)以^ M在脚本的开头,如:

$\ = "^M"; 
+0

没有工作的文件许可..当我进入它时,我试图复制粘贴并执行'$ \ =“( ctrl + ctrl M)“' –

+0

你的斜杠指向错误的方向,而”^ M“不是你如何在perl中表示回车。这是''\ r“' – mkb

+0

这个也适用,如果你用'$ /而不是'$ \'谢谢 –

4

如果mac2unix不为你工作,你可以写自己的mac2unix作为一个Perl的一行:

perl -pi -e 'tr/\r/\n/' file.txt 

如果文件的大小大于虚拟内存较大,虽然这很可能会失败,因为它将整个文件读入内存。

为了完整起见,我们也有一个DOS2UNIX的:

perl -pi -e 'tr/\r//d' file.txt 

和unix2dos:

perl -pi -e 's/\n/\r\n/g' file.txt 
0

perl的-MExtUtils ::命令-e DOS2UNIX的文件