很少用到perl,这次用了一把,特意记录一下关于文件读写和hash统计频数并排序的总结:
1.文件读写
perl下读写文件非常简单:,首先是读:
#打开文件
open(file_name,$_)||dIE "can't open part-m file";
一行一行读出来并处理:
while (<file_name>)
{
chomp;
print $_,"\n";
###
处理
###
}
然后是写:
#创建写的文件:不存在就创建,存在就清空然后再写;如果将">"改成">>"就是追加的写
open(OUTfile1_List,">$resultpath.\SpecificResult.txt")||dIE "can't open file SpecificResult.txt!";
#一行行写文件
print OUTfile1_List ("$lineTxt\n");
#写完关闭
close(OUTfile1_List);
2.哈希统计频数并排序
#初始化
my %hash=();
#统计每个词的个数
$hash{$lineTxt}++;
#按value值排序
my @keys = sort { $hash{$b} <=> $hash{$a} } keys %hash; #@key里头存的是按哈希值的数值大小排序后的键
#按key值排序
my @keys = sort { $b <=> $a} keys %hash; #@key里头存的是按哈希键的数值大小排序后的键
foreach(@keys)
{
print OUTfile2_List ("$_"."\t"."$hash{$_}"."\n");
}
下面是我写的用来解析现网数据并排序的源代码:
#!/usr/bin/perl -W
##################
# file:
# Author:
# license:
use strict;
use warnings;
use enCoding 'gbk'; # 系统默认编码为GBK
use open IN=>':enCoding(utf8)'; # 读入文件时认为数据按UTF-16编码,自动根据BOM头判断是LE还是BE
use Encode;
use file::Path;
use TIE::file;
#读取外部传入的待解析现网数据的存放目录路径
my $dirpath="";
if(@ARGV == 1)
{
$dirpath = $ARGV[0];
}else
{
print "< .pl > <待解析现网数据的存放目录路径>\n";
exit(0);
}
print "dir path: ${dirpath}\n";
#$dirpath="E:\\vIDeo_network_data";
my @filearray=(); #存放每个part-m文件的绝对路径
my $filecount = 0; #存放part-m文件的个数
###### 遍历文件夹 #####
sub parse_env {
my $path = $_[0];
my $subpath;
my $handle;
if (-d $path) {#当前路径是否为一个目录
if (opendir($handle,$path)) {
while ($subpath = readdir($handle)) {
if (!($subpath =~ m/^\.$/) and !($subpath =~ m/^(\.\.)$/)) {
my $p = $path."/$subpath";
if (-d $p) {
parse_env($p);
}
else {
if($p=~m/part-m/) {
push(@filearray,$p);
$filecount++;
}
}
}
}
}
closedir($handle);
}
return $filecount;
}
my %hash=();
my $filenum=parse_env $dirpath;
if($filenum > 0) #存在part-m文件
{
print "There are $filenum part-m files!!","\n";
my $resultpath=$dirpath."\parse-result"; mkdir($resultpath) unless(-d $resultpath); #创建目录,准备存放解析结果 open(OUTfile1_List,">$resultpath.\SpecificResult.txt")||dIE "can't open file SpecificResult.txt!"; open(OUTfile2_List,">$resultpath.\FrequencyResult.txt")||dIE "can't open file FrequencyResult.txt!"; foreach(@filearray) { #print $_,"\n"; open(file_name,$_)||dIE "can't open part-m file"; while (<file_name>) { my @strList=split("\t",$_); if(($#strList+1)>=4) { my $lineTxt=$strList[3]; print OUTfile1_List ("$lineTxt\n"); $hash{$lineTxt}++; } } } my @keys = sort { $hash{$b} <=> $hash{$a} } keys %hash; #sort the hash table foreach(@keys) { print OUTfile2_List ("$_"."\t"."$hash{$_}"."\n"); } close(OUTfile1_List); close(OUTfile2_List); print "-------FINISH!!!--------\n"; }
以上是内存溢出为你收集整理的perl下关于文件读写,hash统计频数并排序的总结全部内容,希望文章能够帮你解决perl下关于文件读写,hash统计频数并排序的总结所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)