我有一个Perl脚本,它从Excel(xls
)二进制文件中读取数据。但是向我们发送这些文件的客户端有时会开始向我们发送XLSX
格式文件。我已经更新了脚本以便能够阅读这些内容。但是,客户端有时喜欢使用XLSX
扩展名来命名.xls
文件,因为它使用文件名来确定它的文件类型,因此目前会混淆我的脚本。
XLSX
文件是包含XML内容的zip文件。我的脚本是否有一种简单的方法来查看文件并判断它是否是zip文件?如果是这样,我可以使用我的脚本而不仅仅是文件名。
答案 0 :(得分:17)
是的,可以通过查看magic number。
Perl中有相当多的模块用于检查文件中的magic number。
使用File::LibMagic的示例:
use strict;
use warnings;
use File::LibMagic;
my $lm = File::LibMagic->new();
if ( $lm->checktype_filename($filename) eq 'application/zip; charset=binary' ) {
# XLSX format
}
elsif ( $lm->checktype_filename($filename) eq 'application/vnd.ms-office; charset=binary' ) {
# XLS format
}
另一个例子,使用File::Type:
use strict;
use warnings;
use File::Type;
my $ft = File::Type->new();
if ( $ft->mime_type($file) eq 'application/zip' ) {
# XLSX format
}
else {
# probably XLS format
}
答案 1 :(得分:16)
.xlsx文件的前2个字节为'PK',因此可以对前2个字符进行简单的打开和检查。
答案 2 :(得分:6)
编辑:Archive :: Zip是一个更好的
solution
# Read a Zip file
my $somezip = Archive::Zip->new();
unless ( $somezip->read( 'someZip.zip' ) == AZ_OK ) {
die 'read error';
}
答案 3 :(得分:2)
使用File::Type
:
my $file = "foo.zip";
my $filetype = File::Type->new( );
if( $filetype->mime_type( $file ) eq 'application/zip' ) {
# File is a zip archive.
...
}
我刚刚使用.xlsx
文件对其进行了测试,mime_type()
返回了application/zip
。同样,对于.xls
文件,mime_type()
为application/octet-stream
。
答案 4 :(得分:1)
您可以通过检查Excel头文件的第一个字节来检测xls文件。
可以从此处获取有效的旧Excel标题列表(除非您知道其Excel的确切版本,请检查所有适用的可能性):
http://toorcon.techpathways.com/uploads/headersig.txt
此处描述了Zip标头:http://en.wikipedia.org/wiki/ZIP_(file_format)#File_headers 但我不确定.xlsx文件是否具有相同的标题。
File :: Type的逻辑似乎是“PK \ 003 \ 004”作为决定zip文件的文件头...但是我不确定这个逻辑是否会起作用.xlsx,没有要测试的文件。
答案 5 :(得分:-1)
The-Evil-MacBook:~ ivucica$ file --mime-type --brief file.zip
application/zip
因此,可能比较
`file --mime-type --brief $filename`
使用application/zip
可以检测到拉链。当然,您需要安装file
,这在UNIX系统上很常见。我恐怕无法提供Perl示例,因为Perl的所有知识都从我的记忆中消失了,而且我手头没有例子。
答案 6 :(得分:-2)
我不能说Perl,但是对于我使用的框架.Net,有许多库可以操作你可以使用的zip文件。
我见过人们使用的另一件事是WinZip的命令行版本。它提供的返回值在文件解压缩时为0,在出现错误时为非零。
这可能不是最好的方法,但这是一个开始。