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