使用perl解析csv文件类型中的字符串

使用perl解析csv文件类型中的字符串,perl,Perl,我使用perl的Tie::File解析.csv文件并匹配特定字符串,它实际上是文件上的第一个字符串/头 我遇到的问题可能是我的输入文件类型。导出数据文件的工具可以以.csv或文本格式导出,我尝试并测试了这两种格式 不知怎的,我还是没有得到比赛。我的问题可能有两方面: (1) 我的正则表达式错误和/或(2)文件类型 示例文件头/字符串(如果Icat文件): 示例文件头/字符串(如果我在编辑器中打开,苹果的TextEdit.app) 这是八进制转储: 0000000 377 376 G \0

我使用perl的
Tie::File
解析.csv文件并匹配特定字符串,它实际上是文件上的第一个字符串/头

我遇到的问题可能是我的输入文件类型。导出数据文件的工具可以以.csv或文本格式导出,我尝试并测试了这两种格式

不知怎的,我还是没有得到比赛。我的问题可能有两方面: (1) 我的正则表达式错误和/或(2)文件类型

示例文件头/字符串(如果I
cat
文件):

示例文件头/字符串(如果我在编辑器中打开,苹果的TextEdit.app)

这是八进制转储:

0000000 377 376   G  \0   l  \0   o  \0   b  \0   a  \0   l  \0      \0
        feff 0047 006c 006f 0062 0061 006c 0020
0000020      \0   M  \0   a  \0   i  \0   l  \0   _  \0   D  \0   a  \0
        0020 004d 0061 0069 006c 005f 0044 0061
0000040   t  \0   e  \0   .  \0   D  \0   a  \0   t  \0  \r  \0  \n  \0
        0074 0065 002e 0044 0061 0074 000d 000a
显然,执行操作系统
cat
会在字符串上显示一个前导

代码:


看起来您的文件是用utf16编码的

试着这样做:

binmode STDIN, ':encoding(UTF-16LE)';
while (<STDIN>) {
  if (m/Global/) {  # see note
    print "Matched Global on line $.\n";
  }
}

我正在查看八进制转储,注意到每个常规字符之间的空字符。也就是说,它是
G-\0-l-\0-o-\0-b-\0-a-\0-l-\0
,而不是
G-l-o-b-a-l
。这意味着您的文件不是ASCII文本。这是UTF8还是UTF16格式?如果是这样,在Perl中打开文件时,必须使用
编码
函数:

open(my $fh, "<:encoding(UTF-16)", $fileName)
    or die qq(Can't open file "$fileName" for reading);

open(my$fh),?可能是一个unicode BOM表,TextEdit可以看到/跳过。
cat
只是一个简单的“转储到输出”,不会以任何方式处理文本。因此,我的正则表达式应该可以正常工作?有没有更好的方法来编写它?没有,因为Perl也会吸收BOM表。你的正则表达式正在寻找“全局”“作为一行上的第一件事——它不是——它前面有两个未知字符,因此正则表达式从不匹配。似乎只要删除
/^Global/
中的
^
就可以解决它,除非你希望在其他行上使用“Global”这个词。可能类似于
/^.{0,2}”Global/
@Chriszuma-谢谢。我尝试了你的两个建议,但仍然没有成功。我添加了八进制转储(请参见编辑)。我还没弄清楚。
use strict;
use warnings;
use Tie::File;
use File::Copy;

    for (@ARGV) {
        tie my @lines, "Tie::File", $_;             
        #shift @lines if $lines[0] =~ /^Global/;
        if ($lines[0] =~ /^Global/) 
        {
             print "We have a match, remove the line ..";
             #shift @lines if $lines[0] =~ /^Global/;
             untie @lines; 
        }
        else
        { 
             print "No match found. Exit";
        }

}
binmode STDIN, ':encoding(UTF-16LE)';
while (<STDIN>) {
  if (m/Global/) {  # see note
    print "Matched Global on line $.\n";
  }
}
binmode STDIN, ':encodeing(UTF-16LE)';
read(STDIN, my $buf, 1);
while (<STDIN>) {
  if (m/^Global/) { ... }
}
open(my $fh, "<:encoding(UTF-16)", $fileName)
    or die qq(Can't open file "$fileName" for reading);