使用Perl读取Excel文件

使用Perl读取Excel文件

1. 任务

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

    词表文件格式如下:

    使用Perl读取Excel文件

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

2. 使用什么模块

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

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

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

    使用Perl读取Excel文件

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

    使用Perl读取Excel文件

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文件,进行尝试:

    使用Perl读取Excel文件

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

    使用Perl读取Excel文件

    根据网上资料来看,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即可。

    上面代码显示结果正常:

    使用Perl读取Excel文件

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

6. 任务实现

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

     使用Perl读取Excel文件

     从第7行到14635行,刚好14629行。

7. 文件

    /Files/pangxiaodong/LearningPerl/Perl读取EXCEL词典文件.zip

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110481.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大数据平台框架、组件以及处理流程详解

    大数据平台框架、组件以及处理流程详解数据产品和数据密不可分作为数据产品经理理解数据从产生、存储到应用的整个流程,以及大数据建设需要采用的技术框架Hadoop是必备的知识清单,以此在搭建数据产品时能够从全局的视角理解从数据到产品化的价值。本篇文章从三个维度:1.大数据的处理流程2.大数据的的平台框架Hadoop3.Hadoop生态圈组件理解了数据从产生到场景应用每个环节的流程过程以及企业在建立大数据平台时需要采用的技术…

    2022年5月23日
    148
  • 视频识别车牌号(Python)

    视频识别车牌号(Python)提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 使用步骤 总结一、前言视频识别车牌号(有视频和代码)二、使用步骤直接上代码#导入所需要的库fromhyperlprimport*importcv2importnumpyasnp#定义保存图片函数#image:要保存的图片名字#addr;图片地址与相片名字的前部分#num:相片,名字的后缀。int类型defsave_image(i..

    2022年5月20日
    84
  • 圣杯布局、双飞翼布局、Flex布局和绝对定位布局的几种经典布局的具体实现示例

    圣杯布局、双飞翼布局、Flex布局和绝对定位布局的几种经典布局的具体实现示例题目要求:针对如下DOM结构,编写CSS,实现三栏水平布局,其中left、right分别位于左右两侧,left宽度为200px,right宽度为300px,main处在中间,宽度自适应。要求:允许增加额外的DOM节点,但不能修改现有节点顺序。<divclass="container">  <divclass="main">main</div>  <divclass="

    2022年6月29日
    25
  • rct429 java_RCT: RCT(Redis Computed Tomography) RCT 是一个通过解析rdb文件对redis内存结构分析的一站式平台。 支持对非集群/集群rdb文…[通俗易懂]

    Language:RCT(RedisComputedTomography)RCT是一个通过解析rdb文件对redis内存结构分析的一站式平台。支持对非集群/集群rdb文件分析、Slowlog查询与监控、ClientList查询与监控。GitHub第一时间更新,请移步查看!功能内存分析通过对rdb文件解析,分析Redis内存使用情况,支持多维度、多报表方式。支持手动、自动多种方式!提…

    2022年4月18日
    57
  • 舆情监测分析系统_舆情监测系统

    舆情监测分析系统_舆情监测系统一、引言1.1目的  编写此文档的目的是确认舆情分析系统的需求及系统边界,指导系统的设计。1.2项目信息项目名称:舆情分析系统项目提出者:指导教师开发者:东北大学软件学院大数据班T09实训项目组(lzf、lcx)用户:舆情分析员、系统管理员1.3缩写说明1.4术语定义1.5参考资料新浪舆情通:https://yqt.mdata.net/二、舆情分析系统概述2.1舆情分析系统介绍  我们的舆情分析系统主要包括舆情总缆分析、舆情搜索、文章分析、文章评论分析、事件

    2022年9月14日
    2
  • encodeURIComponent() 函数

    encodeURIComponent() 函数

    2021年10月9日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号