使用Perl读取Excel文件

1. 任务

为了实现一些机械分词算法,准备使用“国家语委语料库”的分词词表,在线下载到得词表文件是一个Excel文件。本文的任务就是使用Perl从该Execl文件中提取所有的词语。

词表文件格式如下:

需要的词语的位置在从第8行开始的,第B列的所有单元格。一共有14629个词语。(PS:语料库的分词词表包含8万多个词语,但是在线下载到是出现次数在50次以上的词语,只有这1万多)。

2. 使用什么模块

通过阅读一些博文发现,PERL的Spreadsheet::ParseExcel模块支持Excel的读操作。

3. 如何下载模块(windows xp上的草莓PERL)

在命令行下输入:cpan Spreadsheet::ParseExcel,即可自动安装。

安装结束后,输入perldoc Spreadsheet::ParseExcel,即可检测是否安装成功。(如果安装失败,会输出安装失败)

4. 样例代码

感觉perldoc的样例代码读起来很费力,不如直接到cpan网站上面去看样例代码,或者下载模块的样例代码。

登录cpan网站:http://search.cpan.org/,查找Spreadsheet::ParseExcel模块,在其主页
http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel-0.59/lib/Spreadsheet/ParseExcel.pm#NAME  
上面可以找到样例代码和一些解释。样例代码如下,遍历所有的worksheet,遍历每个worksheet下面的单元格。

#!/usr/bin/perl -w

use strict;
use Spreadsheet::ParseExcel;

my $parser   = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse(‘Book1.xls‘);

if ( !defined $workbook ) {
    die $parser->error(), ".\n";
}

for my $worksheet ( $workbook->worksheets() ) {

my ( $row_min, $row_max ) = $worksheet->row_range();
    my ( $col_min, $col_max ) = $worksheet->col_range();

for my $row ( $row_min .. $row_max ) {
        for my $col ( $col_min .. $col_max ) {
           my $cell = $worksheet->get_cell( $row, $col );
           next unless $cell;
           print "Row, Col    = ($row, $col)\n";
           print "Value       = ", $cell->value(),       "\n";
           print "Unformatted = ", $cell->unformatted(), "\n";
           print "\n";
        }
    }
}

另外,在该网页上可以找到该模块的文件:

http://search.cpan.org/CPAN/authors/id/J/JM/JMCNAMARA/Spreadsheet-ParseExcel-0.59.tar.gz

这个压缩包包含了很多模块的样例代码。

5. 样例文件读取

首先建立一个只有4行1列的excel文件,进行尝试:

然后使用前面的样例代码,将‘Book1.xls‘替换为目标文件名,即可。显示中文乱码。

根据网上资料来看,excel的字符编码是unicode,一般使用如下代码进行解决:

my $formatter = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>"CP936");
my $workbook = $parser->parse(‘example.xls‘, $formatter);

完整代码如下:

#!/usr/bin/perl -w

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;

my $parser   = Spreadsheet::ParseExcel->new();
my $formatter = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>"CP936");
my $workbook = $parser->parse(‘example.xls‘, $formatter);

if ( !defined $workbook ) {
    die $parser->error(), ".\n";
}

for my $worksheet ( $workbook->worksheets() ) {

my ( $row_min, $row_max ) = $worksheet->row_range();
    my ( $col_min, $col_max ) = $worksheet->col_range();

for my $row ( $row_min .. $row_max ) {
        for my $col ( $col_min .. $col_max ) {
           my $cell = $worksheet->get_cell( $row, $col );
           next unless $cell;
           print "Row, Col    = ($row, $col)\n";
           print "Value       = ", $cell->value(),       "\n";
           print "\n";
        }
    }
}
<STDIN>;

注意所有需要安装的模块有如下几个:

Spreadsheet::ParseExcel:最开始安装的。
    Unicode::Map:这个要安装一下,用于字符编码。
    IO-stringy:这个已经安装过了,具体不清楚。
    OLE-Storage_Lite:这个是访问office套件的需要的包。在安装Spreadsheet::ParseExcel被安装了。

这里只需要安装Unicode::Map即可。

上面代码显示结果正常:

此处可以发现,行和列的单元格的下标都是从0开始的。

6. 任务实现

词语的行从第8行开始(下标为7),列都在第2列(下标为1)。这样对代码略作修改,令$row_min=7,令$col_min=$col_max=1。修改目标文件名为‘CorpusWordlist.xls‘。输出结果如下:

my $worksheet_count = $workbook->worksheet_count(); #得到当前表的数量

my $filename = $workbook->get_filename(); #得到当前文件名
my $name = $worksheet->get_name();    #得到表的名称

#----------------------------------------------------------------------写代码---------------------------------------------------------------------------------

时间: 2024-10-26 09:40:58

使用Perl读取Excel文件的相关文章

Perl读取Excel文件并解决中文乱码问题

使用CPAN中的Spreadsheet::ParseExcel模块读取Excel文件中的内容,当遇到中文乱码问题时,使用Spreadsheet::ParseExcel::FmtUnicode模块重新编码,当将中文赋值给变量时,用Encode模块经GB2312解码即可. use strict;   use Spreadsheet::ParseExcel;   use Spreadsheet::ParseExcel::FmtUnicode; use Encode;       my $oFmtC=S

java无依赖读取Excel文件

说到Java读取Excel文件,用得多的当然是POI或jxls,但今天在看一本书的时候.当中提到使用JdbcOdbcDriver这个驱动类在不依赖第三方库的情况下也能够完毕对Excel文件的读取操作,网上搜了一下原因然后自己写了个样例跑通了,在此记录一下. Java读取数据库大家都非常熟悉,须要一个数据源与对应的驱动.开发人员通过JDBC操作驱动.驱动再去操作数据库.那么Java读取Excel文件也是类似的.在Windows系统中,能够将一个Excel文件注冊为一个ODBC数据源,注冊过程为:

PHPExcel读取excel文件示例

PHPExcel的类库下载地址:  https://github.com/PHPOffice/PHPExcel 转载自: http://www.imhdr.com/1332/comment-page-1/ PHPExcel是一个非常方便生成Excel格式文件的类,官方下载包中带有大量如何生成各种样式excel文件的示例,但没有一个读取Excel文件的完整例子.Xiaoqiang根据网上的资料,整理了一份简单读取Excel文件的例子.传统方法: <?php /** * * @copyright 2

PHP读取Excel文件内容

PHP读取Excel文件内容 项目需要读取Excel的内容,从百度搜索了下,主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel. PHPExcelReader比较轻量级,仅支持Excel的读取,实际上就是一个Reader.但是可惜的是不能够支持Excel 2007的格式(.xlsx). PHPExcel比较强大,能够将内存中的数据输出成Excel文件,同时还能够对Excel做各种操作,下面主要介绍下如何使用PHPExcel进行Excel 2007格式(.xlsx)文

python读取excel文件(xrld模块)

Python读取excel文件 一.python  xlrd模块 安装 mac 下安装python  xlrd模块 http://www.crifan.com/python_read_excel_xls_file_xlrd/comment-page-1/ python setup.py install 在mac 下出现的错误是 http://stackoverflow.com/questions/18199853/error-could-not-create-library-python-2-7

[Windows问题-4] C#读取excel文件

问题:使用C#程序读取excel文件,包括后缀为.xls和.xlsx 相信很多朋友都有在程序中读取excel文件的需求,我在调研的过程中也看了很多文章,基本思路都是正确的,但是有一些代码是没有通过验证的,在实际操作的过程中总会遇到一些问题,经过摸索,最终总结出一套可行的方案,在这里跟大家分享. 读取Excel的方法有多种,我这里选择了一种效率较高的方法,将读取出来的数据存放到一个DataSet之中. 代码如下: using System; using System.Collections.Gen

C# 读取EXCEL文件的三种经典方法

1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;"; OleDb

winform下读取excel文件并绑定datagridview例子

首先我要读取这个excel文件然后生成Datable 用winform编程的方式 前台界面: 后台的代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.

Java编程:使用Java读取Excel文件内容

微软的ODBC驱动程序把工作表中的第一行作为列名(译者注:即字段名),工作表名作为数据库表名. 要通过JDBC访问工作表,我们还必须创建一个新的ODBC数据源,在Windows 2000系统上创建数据源的过程如下: 进入“控制面板” --> “管理工具” --> “数据源(ODBC)”,(译者注:打开后选择系统DSN),点击添加,在弹出窗口中选择“Driver do Microsoft Excel(*.xls)” 然后在数据源名处输入一个名字myexcel(译者注:相当于数据库名),然后点击“